Python:为什么导入的变量没有更新?

时间:2017-05-08 18:36:02

标签: python import python-import

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 ????

1 个答案:

答案 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),并将本地名称空间中的名称绑定到对象   找到。