2017-05-08 33 views
0

This is apparently the same question as this(S.O.直到后来才发现它)。我正在调查重复。然而,单单标题行使这成为一个有用的问题。Python:为什么不导入变量更新?

在以下(两个)代码块中,为什么我在导入时没有获取更新的值?

两个文件: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

是的。但S.O.直到你没有发现这个问题。所以是的,这是重复的,但我会认为辅助搜索词很有用。绝对没有迹象表明这些是标题中的同一个问题。 –

回答

-1

NOPE。结果这是一个谎言/错觉。

当您导入时,您将导入导入符号的当前值并将其添加到您定义的名称空间中。您未输入参考,您正在输入一个值。

因此,要获取更新值i,必须导入一个变量,该变量包含对该符号的引用。

换句话说,进口并不像在JAVA的import,在C/C external声明++或者甚至use子句中PERL。

相反,在Python以下语句:

from some_other_module import a as x 

更像以K & RC以下代码:

extern int a; /* import from the EXTERN file */ 

int x = a; 

(警告:在Python情况下, “a” 和“ x“基本上是对实际值的参考:您不复制INT,您正在复制参考地址)

This is sneakily defined in the Python language reference:使用对象而不是符号。我会建议Python语言参考使这个更清晰和不太合法。在 步骤(1)中找到的模块在它通过识别的 名单,看起来他们每个人最多,并在当地命名空间绑定名称:

from形式不绑定的模块名称到对象因此发现 。

+0

现在尝试与列表相同。为'i'分配一个列表并修改'change_i'为* append *或者修改'i'而不改变'i'指的是什么。 – vaultah

+0

你只是在我的回答开始时重复我的陈述。你想说什么? –

+0

实际上,您确实会将引用导入到另一个模块中的同一个对象。没有谎言,没有副本。问题是,'i = x' _rebinds_模块命名空间中的'i'到另一个对象。 – tdelaney