我想知道为什么我可以更改全局字典而不用global
关键词?为什么其他类型必须这样做?这背后有什么逻辑吗?
例如。代码:
#!/usr/bin/env python3
stringvar = "mod"
dictvar = {'key1': 1,
'key2': 2}
def foo():
dictvar['key1'] += 1
def bar():
stringvar = "bar"
print(stringvar)
print(dictvar)
foo()
print(dictvar)
print(stringvar)
bar()
print(stringvar)
给出以下结果:
me@pc:~/$ ./globalDict.py
{'key2': 2, 'key1': 1}
{'key2': 2, 'key1': 2} # Dictionary value has been changed
mod
bar
mod
我期望的地方:
me@pc:~/$ ./globalDict.py
{'key2': 2, 'key1': 1}
{'key2': 2, 'key1': 1} # I didn't use global, so dictionary remains the same
mod
bar
mod
原因是该行
stringvar = "bar"
不明确,它可能指的是全局变量,or它可能会创建一个名为的新局部变量stringvar
。在这种情况下,Python 默认假设它是局部变量,除非global
关键字已被使用。
然而,该行
dictvar['key1'] += 1
是完全不含糊的。它可以仅引用全局变量dictvar
, since dictvar
该语句必须已经存在,才不会引发错误。
这并非特定于字典 - 列表也是如此:
listvar = ["hello", "world"]
def listfoo():
listvar[0] = "goodbye"
或其他类型的物体:
class MyClass:
foo = 1
myclassvar = MyClass()
def myclassfoo():
myclassvar.foo = 2
每当使用变异操作而不是重新绑定操作.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)