代码之家  ›  专栏  ›  技术社区  ›  user225312

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

  •  4
  • user225312  · 技术社区  · 15 年前

    列表=[] def foo(): ...

    随叫随到 foo() ,我得到这个错误:

    UnboundLocalError: local variable 'VAR1' referenced before assignment
    

    但是,考虑一下列表 LISTL

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

    这和预期的一样。问题是为什么列表上的append可以工作,但我不能更改int?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Joseph Spiros    15 年前

    造成这种差异的原因与Python如何命名名称空间有关。如果你在函数定义中( def foo(): VAR1 LISTL ),它将首先搜索您的本地名称空间,在那里它将找不到任何内容,然后它将搜索在其中定义函数的模块的名称空间,一直搜索到全局名称空间,直到找到匹配项,或者失败。

    但是,访问名称和分配名称是两个不同的概念。如果你在你的函数定义中,你说 VAR1 = 2 ,您正在用新的本地名称声明一个新变量 变量1 函数内部。如果您考虑到如果工作中没有这样的名称空间,那么您将遇到各种各样的命名冲突,那么这是有意义的。

    += ,实际上是给一个名称赋值。

    如果希望能够将值赋给在当前命名空间之外定义的名称,可以使用 global keyword global VAR1

        2
  •  4
  •   dan04    15 年前

    如果在函数中赋值给某个变量,除非声明该变量,否则该变量将被假定为局部变量 global .