好像在做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(只是相同内存的别名)。我缺少什么?
只是相同内存的别名
您误解了“变量”在 python 中的工作原理。变量是not记忆位置。他们只是names附着在物体上。当您执行任务时:
i = 0
你正在给出名字i
to a new object 0
在当前范围内.
您应该阅读有关的文档命名和绑定
也许一张图可以让这一点更清楚:
修改前的情况i
:
foo.i i
| /
| /
| /
| /
| /
| /
| /
+-----+
| 999 |
+-----+
物体999
有两个参考。当你这样做时:
i = 0
发生的情况是这样的:
foo.i i
| |
| |
| |
| |
| |
| |
| |
+-----+ +---+
| 999 | | 0 |
+-----+ +---+
如果你想修改的值999
对象...好吧:你can't因为在Python中整数是不可变的.
请注意,它doesn't与范围有关:
i = 999
j = i
i = 0
print(i, j) # prints: 0 999
名字i
and j
只是labels到物体。如果你来自C,你可能会想到everypython 变量作为pointer到实际的对象。就好像上面的代码是:
int *i = &999;
int *j = i;
i = &0;
printf("%d %d", *i, *j);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)