看起来这样做from foo import i会复制 i,而不是将 i 导入当前命名空间。这可能吗?
from foo import 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 中,from foo import i 和 import foo 是两种不同的导入方式,它们的行为有所不同,这就是您观察到的现象。
import foo
import foo:这会将 foo 模块导入到当前命名空间,并且通过 foo.i 可以访问 foo 模块中的 i。此时 foo 是一个模块对象,foo.i 是模块 foo 中的变量 i 的引用。
foo
foo.i
i
from foo import i:这种导入方式会将 foo 模块中的 i 变量直接导入到当前命名空间中。这意味着变量 i 会被复制到当前的命名空间,而不是创建一个引用。因此,您实际上是复制了 foo.i 的值到 bar.py 中的一个新的变量 i。
bar.py
在 from foo import i 之后,i 和 foo.i 是两个独立的变量。改变其中一个变量的值不会影响另一个。
foo.i = 999 print(i) # 输出 0 print(foo.i) # 输出 999
foo.i = 999
print(i)
0
print(foo.i)
999
要让 i 和 foo.i 共享同一个内存地址,您应该避免使用 from foo import i,而使用 import foo。这样,foo.i 和 i 将始终引用同一个变量。
修改代码如下:
import foo foo.i = 999 # 修改 foo 中的 i print(foo.i) # 输出 999 print(foo.i) # 输出 999
希望这个解释能够解决您的问题!