This is apparently the same question as this(S.O.直到后来才发现它)。我正在调查重复。但是,标题线本身就是一个有用的问题。
在以下(两个)代码块中,为什么我导入时没有获得更新的值?
两个文件:import.py和export.py 这是export.py:
i=12345
def change_i(x):
global i
i=x
print "export changed i to {0}".format(repr(i))
这是import.py:
from export import i, change_i
print "Import gets i={0}".format(repr(i))
change_i(5)
print "Import has i={0}".format(repr(i))
结果如下:
> python import.py
Import gets i=12345
export changed i to 5
Import has i=12345
为什么import.py没有获得新值5 ????
答案 0 :(得分:-1)
<强> NOPE。扭转这是一个谎言/错误。
导入时,导入导入符号的当前值并将其添加到定义的命名空间中。 您没有导入引用,而是导入值。强>
因此,要获取i
的更新值,您必须导入一个包含对该符号的引用的变量。
换句话说,导入不像JAVA中的import
,C / C ++中的external
声明,甚至PERL中的use
子句。
相反,Python中的以下语句:
from some_other_module import a as x
更像是K&amp; R C中的以下代码:
extern int a; /* import from the EXTERN file */
int x = a;
(警告:在Python的情况下,&#34; a&#34;和&#34; x&#34;基本上是对实际值的引用:你没有复制INT,你&#39; ;重新复制参考地址)
This is sneakily defined in the Python language reference:使用对象代替符号。我建议Python语言参考使这更清晰,更不合法。
from
表单不绑定模块名称:它通过 标识符列表,在找到的模块中查找每个标识符 步骤(1),并将本地名称空间中的名称绑定到对象 找到。