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

标签 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(只是相同内存的别名)。我错过了什么?

最佳答案

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/

相关文章:

python - Pandas 在相同事件但不同时间戳上展平时间序列数据帧

Python - 调用子模块时的相对文件位置

python - Keras 意外的内核正则化器错误

python - 可视化完整的互相关矩阵

python - 如何在 Tensorflow 中使用指数移动平均线

python - 如何在 Spyder IDE 中为 Pylint 设置配置文件

python - Django FormWizard 和管理应用程序

python - ImportError : No module named django. session

Windows 中的 Python XVFB 错误

python - pyinstaller编译成exe