This question already has an answer here:
Why is the global keyword not required in this case?

(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