什么时候需要全局声明?

When is the global statement necessary?

我对 "global" 的说法有点困惑。

"sample code 1" 运行不用"global"语句也可以;但是,"sample code 2" 不会 运行 除非 "global a" 未被注释。

为什么我必须在 "sample code 2" 中声明 "global" 而不是在 "sample code 1" 中?

# sample code 1

def updating():    
    a.append(1);    

if __name__=='__main__':
    a=[100];
    print(f'before updating, variable a id is {id(a)}, and value is {a}')
    updating()
    print(f'after  updating, variable a id is {id(a)}, and value is {a}')

# sample code 2

def updating(): 
    #global a 
    a=a+[1]

if __name__=='__main__':
    a=[100];
    print(f'before updating, variable a id is {id(a)}, and value is {a}')
    updating()
    print(f'after  updating, variable a id is {id(a)}, and value is {a}')

默认情况下,对名称的赋值 总是 对局部变量进行操作,如果当前未定义则创建一个新变量。

global 语句使名称引用全局范围内的变量,允许您分配给全局名称而无需创建新的局部变量。

nonlocal 语句做类似的事情,除了它使名称引用在最近的封闭范围内定义的变量,该范围不一定是全局范围。)

在你的第一个例子中,你没有分配一个名字;您正在对一个自由变量执行属性查找,该变量解析为同名的全局变量。

在您的第二个示例中,您尝试创建一个新的局部变量。由于范围是在编译时确定的,a = a + [1] 将失败,因为右侧的 a 仍将引用尚未定义的局部变量 a。使用 global 时,赋值 不会 创建局部变量,因此右侧是涉及全局变量的表达式,结果赋值给全局名称为嗯。