什么时候需要全局声明?
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
时,赋值 不会 创建局部变量,因此右侧是涉及全局变量的表达式,结果赋值给全局名称为嗯。
我对 "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
时,赋值 不会 创建局部变量,因此右侧是涉及全局变量的表达式,结果赋值给全局名称为嗯。