列表 = []
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 中声明全局的正确方法吗? (就在导入语句之后)
造成这种差异的原因与 Python 命名空间的方式有关。如果你在函数定义中(def foo():
),并且您访问一个名称(VAR1
or LISTL
),它会首先搜索你的本地命名空间,在那里什么也找不到,然后它会搜索定义该函数的模块的命名空间,一直搜索到全局命名空间,直到找到匹配或失败。
然而,访问名称和分配名称是两个不同的概念。如果您再次在函数定义内,并且您说VAR1 = 2
,您正在使用新的本地名称声明一个新变量VAR1
函数内部。如果您考虑到如果工作中没有这样的命名空间,您将会遇到各种命名冲突,这是有道理的。
当您追加到列表时,您只是访问该列表,然后调用它的方法,该方法恰好改变了其概念值。当你使用 do+=
,您实际上是在为名称分配一个值。
如果您希望能够为当前命名空间之外定义的名称赋值,您可以使用global keyword。在这种情况下,在你的函数中,你首先会说global VAR1
,从那里开始,名称 VAR1 将是外部命名空间中的名称,并且对其进行的任何赋值都将在函数外部生效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)