在 Python 中什么是全局语句?
- 2025-03-21 09:07:00
- admin 原创
- 65
问题描述:
什么是全局语句?它如何使用?我读过Python 的官方定义;
但是,它对我来说没有多大意义。
解决方案 1:
Python 中的每个“变量”都限制在一定范围内。Python“文件”的范围是模块范围。考虑以下内容:
#file test.py
myvariable = 5 # myvariable has module-level scope
def func():
x = 3 # x has "local" or function level scope.
具有局部作用域的对象在函数退出时立即消亡,并且永远无法检索(除非您检索return
它们),但在函数内,您可以访问模块级作用域(或任何包含作用域)中的变量:
myvariable = 5
def func():
print(myvariable) # prints 5
def func2():
x = 3
def func3():
print(x) # will print 3 because it picks it up from `func2`'s scope
func3()
但是,您不能对该引用使用赋值并期望它被传播到外部范围:
myvariable = 5
def func():
myvariable = 6 # creates a new "local" variable.
# Doesn't affect the global version
print(myvariable) # prints 6
func()
print(myvariable) # prints 5
现在,我们终于到了global
。global
关键字是告诉 Python 函数中的特定变量是在全局(模块级)范围内定义的方式。
myvariable = 5
def func():
global myvariable
myvariable = 6 # changes `myvariable` at the global scope
print(myvariable) # prints 6
func()
print(myvariable) # prints 6 now because we were able
# to modify the reference in the function
换句话说,如果您使用关键字,您可以myvariable
从模块范围内更改的值。func
`global`
顺便说一下,范围可以任意深度嵌套:
def func1():
x = 3
def func2():
print("x=",x,"func2")
y = 4
def func3():
nonlocal x # try it with nonlocal commented out as well. See the difference.
print("x=",x,"func3")
print("y=",y,"func3")
z = 5
print("z=",z,"func3")
x = 10
func3()
func2()
print("x=",x,"func1")
func1()
现在在这种情况下,没有任何变量是在全局范围内声明的,并且在python2中,没有(简单/干净)的方法可以x
在 范围内func1
更改的值func3
。 这就是nonlocal
在python3.x中引入关键字的原因。 nonlocal
是 的扩展global
,允许您修改从另一个范围中提取的变量,无论它来自哪个范围。
解决方案 2:
mgilson 做得很好,但我想补充一些。
list1 = [1]
list2 = [1]
def main():
list1.append(3)
#list1 = [9]
list2 = [222]
print list1, list2
print "before main():", list1, list2
>>> [1] [1]
main()
>>> [1,3] [222]
print list1, list2
>>> [1, 3] [1]
在函数内部,Python 将每个变量视为局部变量,除非您将其声明为全局变量,或者您正在访问全局变量。
list1.append(2)
这是可能的,因为您正在访问“list1”,并且列表是可变的。
list2 = [222]
这是可能的,因为您正在初始化局部变量。
但是如果你取消注释#list1 = [9],你会得到
UnboundLocalError: local variable 'list1' referenced before assignment
这意味着您正在尝试初始化一个新的局部变量“list1”,但它之前已经被引用,并且您超出了重新分配它的范围。
要进入范围,请将“list1”声明为全局。
我强烈建议你阅读它,尽管最后有一个错别字。
解决方案 3:
a = 1
def f():
a = 2 # doesn't affect global a, this new definition hides it in local scope
a = 1
def f():
global a
a = 2 # affects global a
解决方案 4:
基本上,它告诉解释器,给定的变量应该在全局级别而不是默认的本地级别进行修改或分配。
解决方案 5:
您可以在修改它的每个函数中将全局变量声明为全局变量,从而在其他函数中使用全局变量
Python 希望通过明确要求全局关键字来确保您确实了解您正在操作的内容。
请参阅此答案
扫码咨询,免费领取项目管理大礼包!