我对“全局”声明有些困惑。
“示例代码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}')
默认情况下,对名称always的赋值作用于局部变量,如果当前未定义,则创建一个新变量。
global
语句使名称引用全局范围内的变量,从而允许您分配给全局名称而无需创建新的本地变量。
([nonlocal
语句执行相似的操作,不同之处在于它使名称引用了在最接近的范围内定义的变量,而该范围不一定是全局范围。]
在第一个示例中,您没有分配名称;您正在对一个自由变量执行属性查找,该变量解析为同名的全局变量。
在第二个示例中,您尝试创建一个新的局部变量。由于范围是在编译时确定的,因此a = a + [1]
将失败,因为右侧的a
仍将引用尚未定义的局部变量a
。使用global
时,赋值确实会创建局部变量,因此右侧是包含全局变量的表达式,并且结果也将赋给全局名称。