为什么我可以通过调用方法来编辑对象,但不能在较小的范围内引用它们的变量名

时间:2017-06-16 21:59:45

标签: python scope

我的main()函数是:

def main():
    ...
    def _help():
        ...
1       a += somelist
2       a.append(something)

    a=[]
    _help()

奇怪的是第2行完全正常,但第1行会引发UnboundLocalError: Local variable 'a' referenced before assignment.

即使我将a声明为main_help顶部的全局变量,它仍然无法正常工作。这是为什么? 这两行都在编辑同一个变量,这让我想到它们两者都应该起作用。如何让第1行工作?

1 个答案:

答案 0 :(得分:2)

每当你在Python中使用<variable> = <something>时,Python都会自动认为它是一个局部变量,除非另有特别说明。

例如:

a = 1
def f():
    if False:
        a = 0
    print(a)  # UnboundLocalError
f()

在这种情况下,+=也可用作作业,但.append不会分配给a,而是调用方法。

通过在您的函数中放置nonlocal a来解决此问题,因此它可以分配到其范围之外的a

def main():
    ...
    def _help():
        nonlocal a
        a += somelist  # Works!

但在这种情况下,你可以a.extend(somelist)