这似乎是 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
名称i
和j
只是对象的标签。如果您来自 C,您可能会将每个 python 变量视为指向实际对象的指针。就好像上面的代码是:
int *i = &999;
int *j = i;
i = &0;
printf("%d %d", *i, *j);
关于python - 从 python 中的模块导入变量会复制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21390975/