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

时间:2014-01-27 20:26:34

标签: python

似乎正在做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(只是相同内存的别名)。我错过了什么?

1 个答案:

答案 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

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

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