python全局变量必须用global定义吗,global在python中的用法解释
这段代码可以打印出x的值,而无需在函数中声明全局x。
x=20
def getx():
打印x
getx()
那么,什么情况下必须使用global来声明全局变量呢?
下面是一个多线程的python代码片段,其中x和l是全局变量,但是threadcode()函数中只声明了全局x而没有声明全局l。完整的代码可以成功运行,但是当全局x被注释掉时,它会报告一个错误。请问这是为什么?锁对象特殊吗?
导入线程,时间,系统
x=50
l=螺纹。锁定()
def线程代码():
全球x
l .获取()
“打印”线程%s已被调用% threading.currentThread()。getName()
尝试:
打印线程%s正在运行% threading.currentThread()。getName()
x=x 50
“打印”线程%s将x设置为% d。“% \
(threading.currentThread()。getName(),x)
最后:
发布()
.
对于Python2来说,对于一个全局变量,如果在你的函数中只使用它的值,而没有给它赋值(a=XXX),就不需要声明global。相反,如果你给它赋值,那么你需要声明global。如果声明了global,这意味着您将值赋给了一个全局变量,而不是局部变量。
Python的范围解析基于称为LEGB(局部、封闭、全局、内置)的规则。看下面这个例子x=10。
def foo():
.x=1
.打印x
.
foo()
回溯(最近一次呼叫):
文件“”中的第1行
foo中文件“”的第2行
UnboundLocalError:在赋值前引用了局部变量“x”
这是因为,当给作用域中的变量赋值时,Python会自动将该变量视为作用域的局部变量,并在作用域外阻止同名的变量。很多时候,向函数添加赋值语句会使您从以前使用的代码中得到一个UnboundLocalError。
以下是文档中的解释:这是因为当你给一个作用域中的变量赋值时,该变量就变成了该作用域的局部变量,并遮蔽了外部作用域中任何相似的命名变量。
使用列表时,很容易引发这种错误。看下面这个例子:lst=[1,2,3]
def foo1():
.lst.append(5) #这没问题.
.
foo1()
地表温度
[1, 2, 3, 5]
lst=[1,2,3]
定义foo2():
.lst=[5] #.这就有问题了!
.
二氧化硫()
回溯(最近一次呼叫):
文件“”中的第1行
foo中文件“”的第2行
UnboundLocalError:在赋值前引用了局部变量“lst”
请注明文章来源和网址:https://www.iplaypy.com/wenda/wd20244.html.
相关文章推荐
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。