具有多个文件的Python全局变量如何工作?

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

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

有什么不同?我认为使用列表类型可能会将它们的代码放在堆内存中。 但是当我使用布尔值时,我也认为将它们的代码放在主堆栈区域中,这样可以很好地工作。 但不是。

python scope global-variables
1个回答
0
投票

当您导入

a
时,您基本上创建了一个带有指向 z1 中定义的值的指针的变量。基本上,你是在说:'

在 z3 中,创建一个名为

a
的变量,指向与 z1 中的
a
相同的地址。

在列表示例中,它按预期工作,因为列表是可变的,因此您可以修改指针后面的值。

但是,布尔值是不可变的,因此每个值(True 和 False)在内存中都有一个预定义的地址,并且您无法修改这些地址后面的值。所以当你写

a = False
时,你是在说:

给原来指向

a
地址的变量
True
分配一个指向
False

地址的指针

因此,您没有修改内存中的任何值,只修改了 z3 文件中的本地指针。然后,当您在 z2 中导入 z1 时,您再次将指针复制到

True

请参阅了解更多信息

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