2017-05-08 53 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