2017-06-06 24 views
0

在定義列表對象的變量,例如:變量引用列表對象與(某些)其他對象不同?

x = [1,2,0.2,3,4] 
y = x 
x.sort() 

我預計y仍然等於[1, 2, 0.2, 3, 4],但事實並非如此。 y的值更改爲x已更改。爲了解決這個問題,我發現使用y = x.copy()可以保留第一行的值。

在另一方面,另一示例:

x = 5 
y = x 
x = 4 

從這個的y值仍然是5,它不會改變作爲x變化。

我的問題:這是由於列表類中的設計,還是有另一種解釋?我發現使用x.append(value)時也會發生動態變化。任何見解都會被讚賞。問候,Arief

+1

強制性閱讀:https://nedbatchelder.com/text/names.html – chepner

+0

@Arief我剛剛看到你重新收錄了「任何見解都值得讚賞,問候,哀悼」。這種稱呼[被認爲是「噪音」,分散於問題本身(應該避免或刪除)](https://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-被移除從 - 個)。 – MSeifert

回答

2

每個變量只是一個指向Python對象的指針,如果你有兩個變量指向同一個對象,那麼你會看到每個變化(和.sort工作原地,如果你想一個新的list你應該使用x = sorted(x))。但是,如果你重新分配一個變量,那麼它將指向一個不同的對象。我包括一些圖像,以更好地觀察發生了什麼(不是高質量的,但我希望它傳達的信息)。

x = [1,2,0.2,3,4] 
y = x 

enter image description here

如果你copy(這是一個淺拷貝,因此列表的內容仍然指向同一個項目!):

x = [1,2,0.2,3,4] 
y = x.copy() 

enter image description here

你的第二個案例是隻是一樣:

x = 5 
y = x 

enter image description here

但你重新分配變量x(使其指向另一個對象後):

x = 4 

enter image description here

+0

感謝您的洞察力和答案。因此,如果'x = [1,2,3]',那麼'x'的值爲[[1,2,3]]。但是,據我所知,它僅僅意味着列表對象'[1,2,3]'可以被'x'調用。如果一個變量引用了另一個變量:'y = x',那麼它可以被認爲是傳遞引用兩次,調用'y'和調用'x'一樣,然後調用現有對象'[1,2,3 ]'。他們依賴於同一個對象。問候。 – Arief

0

的問題是,yx都只是參考班級名單。

當你做這樣的事情:

y=x 

您應對類的參考,而不是創造一個又一個。

使用copy時,您正在做一個淺拷貝正在創建一個新類,將所有元素再次複製到這個新對象。

Python manual提供了一個解釋和其他操作員用於實際複製完整的類。

相關問題