何时需要全局语句?

问题描述 投票:-1回答:1

我对“全局”声明有些困惑。

“示例代码1”无需使用“ global”语句即可正常运行;但是,除非取消对“ global a”的注释,否则“示例代码2”将不会运行。

为什么我必须在“示例代码2”中声明“全局”而不在“示例代码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}')
python reference global variable-assignment shallow-copy
1个回答
1
投票

默认情况下,对名称always的赋值作用于局部变量,如果当前未定义,则创建一个新变量。

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

([nonlocal语句执行相似的操作,不同之处在于它使名称引用了在最接近的范围内定义的变量,而该范围不一定是全局范围。]

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

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

© www.soinside.com 2019 - 2024. All rights reserved.