【问题标题】:Unable to modify a global int, but can modify a list. How?无法修改全局 int,但可以修改列表。如何?
【发布时间】:2010-07-06 05:13:18
【问题描述】:

列表 = [] VAR1 = 0 定义 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 中声明全局变量的正确方法吗? (就在导入语句之后)

【问题讨论】:

    标签: python


    【解决方案1】:

    造成这种差异的原因与 Python 命名空间的方式有关。如果你在一个函数定义中(def foo():),并且你访问了一个名字(VAR1LISTL),它会首先搜索你的本地命名空间,在那里它什么也找不到,然后它会搜索命名空间定义函数的模块,一直到全局命名空间,直到找到匹配项或失败。

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

    当你追加到一个列表时,你只是在访问这个列表,然后调用一个方法来改变它的概念值。当您使用 do += 时,您实际上是在为名称分配值。

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

    【讨论】:

    • 带走:lists 是objects。允许在函数内调用这些对象的方法,但不能重新分配它们。现在它完全有道理。谢谢。
    【解决方案2】:

    如果您在函数中分配给变量,则假定该变量是本地变量,除非您声明它global

    【讨论】:

    • 因为append 不是分配。在没有赋值的情况下,变量被假定为全局变量。
    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2020-10-11
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多