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

use*_*312 4 python

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

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

UnboundLocalError: local variable 'VAR1' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

但是,请考虑清单 LISTL

>>> def foo(x):
...     LISTL.append(x)
...     return LISTL
... 
>>> foo(5)
[5]
Run Code Online (Sandbox Code Playgroud)

这按预期工作.问题是为什么列表中的追加有效,但我无法更改int?

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

Jos*_*ros 5

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

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

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

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