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

Python 为什么我可以通过调用对象的方法而不是在较小的范围内引用它们的变量名来编辑对象,python,scope,Python,Scope,我的main()函数是: def main(): ... def _help(): ... 1 a += somelist 2 a.append(something) a=[] _help() 奇怪的是,第2行工作得非常好,但第1行抛出了一个UnboundLocalError:赋值前引用的局部变量“a”。 即使我在main或\u help的顶部将a声明为全局变量,它仍然不起作用。这是为什么? 这两行代码都在编辑同一个变量

我的main()函数是:

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

    a=[]
    _help()
奇怪的是,第2行工作得非常好,但第1行抛出了一个
UnboundLocalError:赋值前引用的局部变量“a”。

即使我在
main
\u help
的顶部将
a
声明为全局变量,它仍然不起作用。这是为什么?
这两行代码都在编辑同一个变量,这让我觉得要么两者都起作用,要么两者都不起作用。如何使第1行工作?

无论何时在Python中使用
=
,Python都会自动假定它是一个局部变量,除非另有特别说明

例如:

a = 1
def f():
    if False:
        a = 0
    print(a)  # UnboundLocalError
f()
在这种情况下,
+=
也可以用作赋值,但是
.append
不会赋值给
a
,而是调用一个方法

这是通过在函数中放置
非本地a
来解决的,因此它可以将
a
分配到其范围之外:

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

但是在这种情况下,您可以只做
a.extend(somelist)

非局部与全局有何不同?@a-p
x=7;def():def g():非局部x;#x是未定义的;它在f()中查找x,但不在全局中。
x=7;定义f():定义g():全局x;#x==7