2013-11-22 34 views
1

我遇到了一个我的Python代码中的bug,这对我来说似乎很陌生,现在我对全局字典的工作方式感到困惑。阅读并重新分配函数中的全局字典

我的示例代码:

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 

个我的问题:

  1. 如果我能在功能f打印全球myDict,我为什么不能重新分配呢?
  2. 线myDict={}如何破坏打印命令,尽管它稍后执行?

我正在使用Python 2.7。 谢谢你的帮助!

+0

尝试在您的代码顶部添加'''global myDict''',看看会发生什么 – wnnmaw

回答

3

1.如果我可以打印函数f全球myDict,为什么我不能重新分配它?

要从函数中分配一个全局变量,您需要使用global指令。否则,Python将创建一个具有相同名称的本地变量。

global myDict 

将其添加到该函数的顶部。

2.如果行myDict = {}中断了打印命令,尽管它稍后会执行?

在它执行之前,Python会分析整个函数体来确定哪些变量是局部变量,哪些是全局变量。添加分配改变了Python的分析。它将myDict从全局变为局部变量。

这会影响打印语句。它不打印全球myDict它打印本地变量。并且在打印时变量还不存在,从而导致错误。

+0

谢谢!我从SO学到,你不需要全局关键字ford可变(即dict)对象,但现在我发现你确实需要它来重新分配它们。而我根本就不会弄清第二个我自己...... – leeladam

4

当Python编译您的函数时,您分配给任何位置的任何变量都是局部变量,您从未分配给的任何变量都是全局变量。对此的最佳描述是FAQ中的What are the rules for local and global variables in Python

如果要强制的变量,即使你分配给它的是全球性的,你需要一个global声明:

def f(): 
    global myDict 
    print myDict 
    myDict = {} 

事实上,任何不是很明显你的时间是否Python将会把这些变量全球性或非全球性,如果您希望它是全球性的,您应该使用global声明。

(当然,您应该谨慎作为使用全局变量成为可能,这意味着你不应该运行到这个过于频繁。)