【发布时间】:2012-12-28 17:31:15
【问题描述】:
我想知道为什么我可以在没有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
【问题讨论】:
-
我读过SO: Global keyword in Python 和SO: Why is keyword global not required,所以我知道没有
global时字典是如何工作的,但我仍然不明白为什么Python 根据变量类型有不同的作用域方法? -
你还没有理解 Python 中可变对象和不可变对象的区别。如果您阅读了docs.python.org/2/reference/datamodel.html(至少是第 3.1 小节,不要因为您认为您已经知道它而跳过其中的部分内容),那么它应该会变得清晰。
-
在这个问题中没有特定于 Python 3 的内容。
标签: python dictionary scope global-variables global