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中声明全局的正确方法吗? (在导入语句之后)
答案 0 :(得分:5)
这种差异的原因与Python如何命名名称有关。如果您在函数定义(def foo():
)内,并且您访问了一个名称(VAR1
或LISTL
),它将首先搜索您的本地名称空间,它将找不到任何内容,并且然后它将搜索定义函数的模块的命名空间,一直到全局命名空间,直到找到匹配或失败。
但是,访问名称和分配名称是两个不同的概念。如果您再次进入函数定义,并且说VAR1 = 2
,则表示在函数内部使用新的本地名称VAR1
声明了一个新变量。如果您认为如果在工作中没有这样的命名空间,您会遇到各种命名冲突,这是有道理的。
当你附加到列表时,你只是访问列表,然后在其上调用一个恰好改变其概念值的方法。当您使用do +=
时,您实际上是在为名称指定一个值。
如果您希望能够为当前命名空间之外定义的名称分配值,则可以使用global
keyword。在这种情况下,在你的函数中,你首先会说global VAR1
,并且从那里名称VAR1将是外部命名空间中的名称,并且对它的任何赋值都将在函数之外生效。
答案 1 :(得分:4)
如果您为函数中的变量赋值,则除非您声明global
,否则该变量将被视为本地变量。