在函数中读取并重新分配全局字典

时间:2013-11-22 20:02:56

标签: python dictionary

我的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

我的问题:

  1. 如果我可以在函数myDict中打印全局f,为什么我不能重新分配它?
  2. myDict={}如何打破print命令,尽管它会在以后执行?
  3. 我正在使用Python 2.7。 谢谢你的帮助!

2 个答案:

答案 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,而是打印局部变量。并且在打印时,变量尚不存在,因此错误。