gpt4 book ai didi

python - 从 python 中的模块导入变量会复制吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:05:11 26 4
gpt4 key购买 nike

这似乎是 from foo import i 复制了 i 而不是将 i 导入当前命名空间。这可能吗?

foo.py:

i=0

bar.py:

import foo
from foo import i

foo.i = 999

print i
print foo.i

这打印:

0
999

但我预计它们都是 999(只是相同内存的别名)。我错过了什么?

最佳答案

just aliases for the same memory as it were

您误解了“变量”在 Python 中的工作方式。变量不是内存位置。它们只是附在对象上的名称。当您执行作业时:

i = 0

您正在将名称i 赋予 对象0 在当前范围

您应该阅读有关 naming and binding 的文档


也许一张图表可以使这个更清楚:

修改i之前的情况:

foo.i       i
| /
| /
| /
| /
| /
| /
| /
+-----+
| 999 |
+-----+

对象999 有两个引用。当你这样做时:

i = 0

是这样的:

foo.i         i
| |
| |
| |
| |
| |
| |
| |
+-----+ +---+
| 999 | | 0 |
+-----+ +---+

如果你想修改 999 对象的值......好吧:你不能因为在 python 中整数是不可变的 .

请注意,它与作用域有关:

i = 999
j = i
i = 0
print(i, j) # prints: 0 999

名称ij 只是对象的标签。如果您来自 C,您可能会将每个 python 变量视为指向实际对象的指针。就好像上面的代码是:

int *i = &999;
int *j = i;
i = &0;
printf("%d %d", *i, *j);

关于python - 从 python 中的模块导入变量会复制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21390975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com