python的全局变量是如何工作的? 如果我声明它们它们在内存中的哪里?
z1.py
a = [123]
z2.py
from z1 import a
print(a)
print(a)
z3.py
from z1 import a
if __name__ == "__main__":
print(a)
a[0] = 234
import z2
结果
[123]
[234]
[234]
这次,工作得很好,符合我的预期。但如果我不使用列表类型,结果会不同
z1.py
a = True
z2.py
from z1 import a
print(a)
print(a)
z3.py
from z1 import a
if __name__ == "__main__":
print(a)
a = False
import z2
结果
True
True
True
有什么不同?我认为使用列表类型可能会将它们的代码放在堆内存中。 但是当我使用布尔值时,我也认为将它们的代码放在主堆栈区域中,这样可以很好地工作。 但不是。
当您导入
a
时,您基本上创建了一个带有指向 z1 中定义的值的指针的变量。基本上,你是在说:'
在 z3 中,创建一个名为
的变量,指向与 z1 中的a
相同的地址。a
在列表示例中,它按预期工作,因为列表是可变的,因此您可以修改指针后面的值。
但是,布尔值是不可变的,因此每个值(True 和 False)在内存中都有一个预定义的地址,并且您无法修改这些地址后面的值。所以当你写
a = False
时,你是在说:
给原来指向
地址的变量a
分配一个指向True
地址的指针False
因此,您没有修改内存中的任何值,只修改了 z3 文件中的本地指针。然后,当您在 z2 中导入 z1 时,您再次将指针复制到
True
。
请参阅此了解更多信息