Python中的变量有哪些类型?它们的作用域是怎样的?,python变量作用范围
在python中,变量的搜索遵循LGB原理。也就是说,先在局部范围内搜索变量,如果失败,就在全局范围内搜索,最后尝试在内置范围内搜索。如果仍然没有找到,就会抛出一个异常。随着闭包和嵌套函数的出现,作用域增加了外部作用域,变量搜索作用域的优先级有局部、外部、全局和内置。作用域由def、class、lambda等语句生成,而if、try、for等语句不生成新的作用域。请看下面的例子:
defscope1_F1(:)
def f2)):
打印本地_ v
local_v=local
f2())))).
全球v打印
if __name__==__main__ :
global_v=global
scope1_f1()
1 _ f1函数不为global_str赋值。也就是说,变量lobal_str不存在于scope1_f1的局部范围内。但是,程序通常会输出“局部”和“全局”结果。
在局部范围内,不要替换全局变量。
请注意,尽管可以在函数中访问全局变量,但是如果在局部范围内分配了全局变量,python解释器将不会从全局范围内检索它,而是会抛出UnboundLocalError错误。当从本地范围搜索到外部范围时,此规则也有效。
defscope1_F1(:)
全球v打印
global_v=local
if __name__==__main__ :
global_v=global
scope1_f1()
当你运行程序时,你会得到UnboundLocalError:局部变量 global _ v referencedforesignment。
一些文档将此规则描述为“局部范围内的全局变量必须是只读的”。如果变量是list之类的类型,可以通过类似append的方法更改全局变量,而不会影响对局部变量的访问。
defscope1_F1(:)
全球v打印
global_v.add(local)).
if __name__==__main__ :
global_v=[global]
scope1_f1()
在双局部作用域中,全局实现用于给全局变量赋值。
如果需要给全局变量赋值,必须在局部范围内使用全局限定变量。在python2.6中,global可以修改函数中任何地方的变量,但是如果指定了global,解释器会提示SyntaxWarning。
defscope1_F1(:)
global global_v
全球v打印
global_v=local
if __name__==__main__ :
global_v=global
scope1_f1()
类3首先继承第一个基类的变量。
如果变量没有初始化,继承的类将优先于第一个基类中的变量。以下示例输出1而不是2。(注意:如果继承的类是初始化函数,首先调整第一个基类的初始化函数,只有在没有前一个基类的情况下,才调整后一个基类的初始化函数。本文不讨论初始化函数对变量的改变)
sclass1():
a=1
defrun(自身) :
打印自我a
类别2(:)
a=2
defrun(自身) :
打印自我a
d类(sclass2,s class 2):
defrun(自身) :
打印自我a
if __name__==__main__ :
a=dclass()
run().
四个全局作用域引用这个模块,而不是程序。
搜索变量时,只搜索该模块范围内的变量。使用from xxx import *不会破坏模块搜索。在python中导入一个模块可以理解为用当前模块中同名的变量替换另一个模块中的每个变量,而当前模块中的变量替换并不影响导入模块中的变量。
main.py
从模块2导入*
if __name__==__main__ :
模块2_v=5
模块2_v1=3
打印模块2(
p模块2.py
module2_v1=module2
def print _ module 2():
打印模块2_v1
打印模块2_v
python中的一切都是对象和变量,所以对函数、模块等的搜索。也遵循上述规则。
最后还有一个问题:global可以用来给局部范围内的全局变量赋值,那么如何给局部范围内的外部变量赋值呢?目前除了使用list之类的引用传输,我还没有找到其他的解决方案。让我们留在这里一起思考。
Python变量范围
在python中,变量搜索遵循LGB原理,即先在局部范围内搜索变量,如果失败则在全局范围内搜索,最后尝试在内置范围内搜索。如果还是找不到,就会抛出异常。后来由于闭包和嵌套函数的出现,范围又被加到了外部范围,这样变量搜索范围的优先级就变成了:局部、外部、全局、内置。作用域由def、class、lambda等语句生成,但if、try、for等语句不生成新的作用域。让我们看看下面的例子:
定义范围1_f1():
定义f2():
打印本地_v
local_v=local
f2()
打印全局_v
if __name__==__main__ :
global_v=global
scope1_f1()
在scope1_f1函数中,我们没有给global_str赋值(即变量lobal_str在scope1_f1的局部作用域中不存在),但程序正常输出结果‘local’和‘global’。
不应在局部范围内分配全局变量。
请注意,尽管我们可以访问函数中的全局变量,但是一旦在局部范围内分配了全局变量,python解释器将不会在全局范围内寻找它们,而是会抛出一个UnboundLocalError错误。当从本地范围搜索到外部范围时,此规则也有效。
定义范围1_f1():
打印全局_v
global_v=local
if __name__==__main__ :
global_v=global
scope1_f1()
运行程序,我们将得到:unboundLocalError:在赋值前引用了局部变量 global _ v
把这个规则描述为“局部范围内的全局变量应该是只读的”是不准确的。如果变量是list这样的类型,我们可以通过append这样的方法修改全局变量,而不会影响局部作用域对变量的访问。
定义范围1_f1():
打印全局_v
global_v.add(本地)
if __name__==__main__ :
global_v=[global]
scope1_f1()
全局实现用于在局部范围内给全局变量赋值。
如果真的需要给全局变量赋值,应该使用global在局部范围内修改变量。在python2.6中,global可以修改函数中任何地方的变量,但是如果global在赋值之后,解释器会提示SyntaxWarning。
定义范围1_f1():
global global_v
打印全局_v
global_v=local
if __name__==__main__ :
global_v=global
scope1_f1()
三种类型的继承优先于第一个基类中的变量。
当变量未初始化时,继承的类优先于第一个基类中的变量。以下示例将输出1而不是2。(注意:如果继承的类是初始化函数,首先调整第一个基类的初始化函数,如果前面的基类都不存在,调整后面的基类的初始化函数。初始化函数对变量的修改超出了本文的范围),
sclass1():
a=1
定义运行(自身):
打印自我a
sclass2():
a=2
定义运行(自身):
打印自我a
dclass类(sclass1,sclass2):
定义运行(自身):
打印自我a
if __name__==__main__ :
a=dclass()
运行()
四个全局作用域引用这个模块,而不是程序。
在搜索变量时,变量只会在这个模块的范围内搜索,即使使用了from xxx import *也不会破坏模块搜索。在python中导入一个模块可以理解为将另一个模块的变量赋给与当前模块同名的变量,当前模块中变量的赋值不会影响导入模块的变量。
main.py
从模块2导入*
if __name__==__main__ :
模块2_v=5
模块2_v1=3
print _ module 2()
模块2.py
module2_v1=module2
def print _ module 2():
打印模块2_v1
打印模块2_v
python中的一切都是对象和变量,所以对函数、模块等的搜索。也遵循上述规则。
最后还有一个问题:global可以用来给局部范围内的全局变量赋值,那么如何给局部范围内的外部变量赋值呢?目前除了使用list之类的引用传输,我还没有找到其他的解决方案。让我们留在这里一起思考。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。