我只是想看看变量作用域是如何工作的,并遇到了以下情况(全部从终端运行):
x = 1
def inc():
x += 5
inc()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in inc
UnboundLocalError: local variable 'x' referenced before assignment
我在想也许我无法在我的方法中访问 x,所以我尝试了:
def inc():
print(x)
1
所以这有效。现在我知道我可以这样做:
def inc():
global x
x += 1
这可行,但我的问题是为什么第一个例子失败了?我的意思是我希望从那时起print(x)
工作了x
在函数内部可见,那么为什么x += 5
fail?
与采用“真正”词法作用域的语言不同,Python 选择为变量提供特定的“命名空间”,无论是global
, nonlocal
,或本地。可以说,让开发人员有意识地在编写代码时考虑到此类命名空间更加明确,因此也更容易理解。我认为这种复杂性使语言变得更加笨拙,但我想这完全取决于个人喜好。
以下是一些关于global
:-
>>> global_var = 5
>>> def fn():
... print(global_var)
...
>>> fn()
5
>>> def fn_2():
... global_var += 2
... print(global_var)
...
>>> fn_2()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in fn_2
UnboundLocalError: local variable 'global_var' referenced before assignment
>>> def fn_3():
... global global_var
... global_var += 2
... print(global_var)
...
>>> fn_3()
7
相同的模式可以应用到nonlocal
变量也一样,但这个关键字仅适用于后面的Python版本。
如果你想知道,nonlocal
用于变量不是全局变量,但不在其所使用的函数定义内的情况。例如,一个def
在一个def
,这种情况很常见,部分原因是缺乏多语句 lambda。不过,有一个 hack 可以绕过早期 Python 中缺乏此功能的问题,我隐约记得它涉及使用单元素列表......
请注意,写入变量是需要这些关键字的地方。仅仅阅读它们并不含糊,因此不需要。除非你有内心def
使用与外部变量相同的变量名,老实说应该避免这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)