2011-05-01 51 views
1

我有一個簡單的問題。我從文件中讀取一個字符串並存儲在一個列表(名爲:公式)中。然後我將(公式)存儲在另一個變量(fstore =公式)中,以備後用。然後我改變了公式,事實證明,fstore也在改變。爲什麼這種情況繼續發生?我希望fstore保持不變。我沒有在程序的其他地方使用fstore。我的任務(fstore = formula)是否錯誤?python變量

周杰倫

+0

這是功課? – kanaka 2011-05-01 02:17:01

+0

可能重複[Python變量怪異?](http://stackoverflow.com/questions/3619368/python-variable-weirdness) – geoffspear 2011-05-01 05:01:05

回答

4

請記住,在Python這些名稱不是變量,他們引用變量。所以你最後會有兩個別名到一個商店。看一看複製模塊,或者用這個:

cpy = mystr[:] 
+0

作品!非常感謝:) :) – Jay 2011-05-01 04:55:48

5

最重要的這裏的區別是可變之間不變數據類型。在python中,列表是可變的,而元組是不可變的。這意味着,當你「變」一元組這樣的值:

t1 = (1, 2, 3)  # t1 points to (1, 2, 3) 
t2 = t1   # t2 points to the same tuple as t1 
t1 = (2, 3, 4)  # t1 points to a new tuple (2, 3, 4) 

你實際上是創建一個全新的元組和分配t1以指向新的記錄。 t2仍然指向舊的元組,因爲元組是不可改變的,所以不能改變。簡而言之,如果您爲變量指定不可變的值,則可以假定該值永遠不會更改 - 除非您明確地爲變量指定了新值。

但是,當你改變一個列表的價值,你實際上改變列表本身:

l1 = [1, 2, 3]  # l1 points to [1, 2, 3] 
l2 = l1   # l2 points to the same list as l1 
l1[0] = 5   # now [1, 2, 3] becomes [5, 2, 3] 

由於l1l2都指向同一個列表,它們都改變時,其中的一個改變。

要當l1變化,只需使用list不會改變一個副本:

l2 = list(l1) 

或者使用切片表示法:

l2 = l1[:] 
+0

作品!太感謝了 :) – Jay 2011-05-01 04:55:55