无法修改全局int,但可以修改列表。怎么样?

时间:2010-07-06 05:13:19

标签: python

  
    
      

LISTL = []       VAR1 = 0       def foo():           ...... VAR1 + = 1           ...返回VAR1           ......

    
  

在调用foo()时,我收到此错误:

UnboundLocalError: local variable 'VAR1' referenced before assignment

但是,请考虑清单LISTL

>>> def foo(x):
...     LISTL.append(x)
...     return LISTL
... 
>>> foo(5)
[5]

这可以按预期工作。问题是为什么列表中的追加有效但我不能改变int?

另外,这是在Python中声明全局的正确方法吗? (在导入语句之后)

2 个答案:

答案 0 :(得分:5)

这种差异的原因与Python如何命名名称有关。如果您在函数定义(def foo():)内,并且您访问了一个名称(VAR1LISTL),它将首先搜索您的本地名称空间,它将找不到任何内容,并且然后它将搜索定义函数的模块的命名空间,一直到全局命名空间,直到找到匹配或失败。

但是,访问名称和分配名称是两个不同的概念。如果您再次进入函数定义,并且说VAR1 = 2,则表示在函数内部使用新的本地名称VAR1声明了一个新变量。如果您认为如果在工作中没有这样的命名空间,您会遇到各种命名冲突,这是有道理的。

当你附加到列表时,你只是访问列表,然后在其上调用一个恰好改变其概念值的方法。当您使用do +=时,您实际上是在为名称指定一个值。

如果您希望能够为当前命名空间之外定义的名称分配值,则可以使用global keyword。在这种情况下,在你的函数中,你首先会说global VAR1,并且从那里名称VAR1将是外部命名空间中的名称,并且对它的任何赋值都将在函数之外生效。

答案 1 :(得分:4)

如果您为函数中的变量赋值,则除非您声明global,否则该变量将被视为本地变量。