我的Python代码中遇到了一个对我来说很奇怪的错误,我现在对全局字典的工作方式感到困惑。
我的示例代码:
myDict={'two':2,'three':3}
def f():
print myDict
f()
提供我期望的输出:{'two': 2, 'three': 3}
但是,如果我用一行更改代码:
myDict={'two':2,'three':3}
def f():
print myDict
myDict={}
f()
然后我得到
Traceback (most recent call last):
File "test.py", line 9, in <module>
f()
File "proba.py", line 7, in f
print myDict
UnboundLocalError: local variable 'myDict' referenced before assignment
我的问题:
myDict
中打印全局f
,为什么我不能重新分配它?myDict={}
如何打破print命令,尽管它会在以后执行?我正在使用Python 2.7。 谢谢你的帮助!
答案 0 :(得分:4)
当Python编译你的函数时,你分配给任何地方的任何变量都是局部变量,你从未分配给的任何变量都是全局变量。最好的描述是常见问题解答中的What are the rules for local and global variables in Python。
如果要强制变量为全局变量,即使分配给变量,也需要global
语句:
def f():
global myDict
print myDict
myDict = {}
事实上,任何时候你不清楚Python是否会使变量成为全局变量,如果你想让它变为全局变量,你应该使用global
语句。
(当然,你应该尽可能少地使用全局变量,这意味着你不应该经常遇到这种情况。)
答案 1 :(得分:4)
1。如果我可以在函数f中打印全局myDict,为什么我不能重新分配它?
要从函数分配全局变量,您需要使用global
指令。否则,Python将创建一个具有相同名称的局部变量。
global myDict
将其添加到函数顶部。
2。 myDict = {}行如何打破print命令,尽管它稍后执行?
在执行之前,Python会分析整个函数体,以确定哪些变量是本地变量,哪些变量是全局变量。添加分配会更改Python的分析。它将myDict
从全局变为局部变量。
这会影响print语句。它不打印全局myDict
,而是打印局部变量。并且在打印时,变量尚不存在,因此错误。