2011-04-07 167 views
2

爲什麼賦值運算符沒有創建右值的副本,而是引用了該值(在列表中),並且必須使用切片才能創建一個真正的副本,從而創建獨立的對象在一個變化不會影響另一個。這是否與某些特定用法有關,直到現在我錯過的語言?python中的參考問題

編輯:我understod的是,在C++

int a = 1; 
int b = a; 
b = 2; // does not affect a 

,所以我也認爲這將是同樣的道理,因爲Python是用C語言開發,並將其與指針照顧它最有可能。用一些簡單的代碼:

int a = 1; 
/*int b = a;*/ 
int &b = a; /* what python does as I understood, if so why it does that this way?*/ 

更清楚了嗎?

我問的是更多的關於這一點我應該是比較清楚的比較問題,我同意;-)

+2

請閱讀「可變」結構。列表(和字典)是特殊的,因爲它們是可變的。閱讀完「可變」後,請**更新**您的問題以獲得更具體的信息。 – 2011-04-07 11:48:01

+1

S.洛特說真話,呼吸正義。 – jathanism 2011-04-07 11:52:30

+0

Python中的變量是對象的引用。這就是它的設計。如果切片感覺很難看,那就是'copy'模塊。 – 2011-04-07 11:55:00

回答

2

我最近發佈了一個answer認爲確切地討論了這個問題。

+0

不錯的鏈接和很好的解釋,我的理解或多或少是正確的,所以我很高興......+1這個 – 2011-04-07 13:11:03

+1

@Umut Tabak:在答案下是一個「勾號」,你可以點擊顯示你的幸福。 – 2011-04-07 13:17:36

+0

好吧:)我做到了... – 2011-04-07 13:20:17

2

在Python中,一切都可以被看作是一個參考。如果你想分配是一個副本,你總是需要把它excplicitely在你的表達

a = range(10) # create a list and assign it to "a" 
b = a # assign the object referenced by "a" to b 
a is b # True --> a and b are two references to the same object. Works with any object 
     # after b = a 
from copy import deepcopy 
c = deepcopy(a) # or c = a[:] for lists 
c is a # False 
+0

一個對象是一個命名的存儲和名稱是你如何引用的內存位置,這是我所知道的。從這個角度來看,a = [1,2,3],因此[1,2,3]是存儲在內存中的真實對象,a是容納此對象的容器的名稱,是嗎?所有?我在想的是,作業是自動進行復制,但顯然它不會這樣工作...... – 2011-04-07 12:26:30

+0

不,它不。 「b = a」只給存儲在內存中的對象提供一個新名稱。 – Simon 2011-04-07 12:47:46