This question already has an answer here:
Why is the global keyword not required in this case?
(1个答案)
在11个月前关闭。
我想知道为什么不用
例如。代码:
得到以下结果:
我期望的地方:
模棱两可,可能是指全局变量,也可能是创建一个新的本地变量
但是,线
完全是明确的。它只能引用全局变量
这并非仅针对字典-列表也是如此:
或其他种类的物体:
每当mutating operation is used rather than a rebinding one都是如此。
(1个答案)
在11个月前关闭。
我想知道为什么不用
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"
模棱两可,可能是指全局变量,也可能是创建一个新的本地变量
stringvar
。在这种情况下,除非已使用global
关键字,否则Python默认将其假定为局部变量。但是,线
dictvar['key1'] += 1
完全是明确的。它只能引用全局变量
dictvar
,因为dictvar
必须已经存在才能使语句不引发错误。这并非仅针对字典-列表也是如此:
listvar = ["hello", "world"]
def listfoo():
listvar[0] = "goodbye"
或其他种类的物体:
class MyClass:
foo = 1
myclassvar = MyClass()
def myclassfoo():
myclassvar.foo = 2
每当mutating operation is used rather than a rebinding one都是如此。
关于python - 全局词典不需要关键字global来修改它们吗? [复制],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14323817/
10-13 07:00