似乎正在做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(只是相同内存的别名)。我错过了什么?
答案 0 :(得分:5)
只是与同样内存的别名
你误解了“变量”在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);