2012-04-21 92 views
3

是否有一個原因,將列表分配給另一個列表並更改一個項目反映在兩個變化,但更改一個列表不反映在這兩個變化?列表分配到其他列表

a=5 
b=a 
a=3 
print b #this prints 5 

spy = [0,0,7] 
agent = spy 
spy[2]=8 
print agent #this prints [0,0,8] 

spy = [0,0,7] 
agent = spy 
spy = "hello" 
print agent #this prints [0,0,7] 

回答

7

你的第一個變異對象,你的第二個重新綁定

listspy包含)[2]=8

(名叫做「間諜」)= "hello"

2

引用在Python是容易得多,如果你忘了你知道的指針,地址,一切都明白了,路過的價值,按引用傳遞,並將其看作標籤和對象,或名稱和對象。

關注這個:

a=5 
b=a 
a=3 
print b #this prints 5 

你有標籤「一」穿上5,然後「B」把同樣的對象「a」是上,因此5。然後「一」被移除,換上3.'b'仍然在5上,移動'a'到別的東西不會影響它。

spy = [0,0,7] 

你的名字 '間諜' 把名單上的[0,0,7]

agent = spy 

你的名字, '代理' 把相同列表[0,0,7月]

spy[2]=8 
print agent #this prints [0,0,8] 

你把指數2標籤從名單上8.由於代理和間諜是相同的列表這兩個名字,你會看到在這兩個打印時它的變化。

spy = [0,0,7] 

你的名字 '間諜' 名單上[0,0,7]

agent = spy 

你的名字 '代理' 的相同列表[0,0,7]

spy = "hello" 

現在你有名字'間諜'從列表中刪除,並把一個字符串「你好」。該名單仍然有分配給它的標籤「代理」。

print agent #this prints [0,0,7] 

知道了嗎?

+0

+1我寫的是同樣的東西,但你打敗了我; – 2012-04-21 21:33:31

+0

@downvoter,關於如何改進我的答案的建設性意見? – 2012-04-27 18:33:00

+0

+1不錯的解釋:) – tarashish 2012-07-09 06:07:12

1

當您將一個列表分配給一個變量給另一個變量時,它們都屬於同一個列表。

spy = [0,0,7] 
agent = spy 
spy[2]=8 

所以這就是爲什麼你改變間諜這麼劑也發生了變化,因爲兩者都屬於上相同的內存位置相同的列表。你可以檢查,

id(spy) 
id(agent) 

這是調用引用的調用。

但是,如果您在代理初始化後將新列表分配給間諜,則間諜屬於另一個內存位置上的另一個列表。

id(spy) 
id(agent) 

您也可以使用id()函數來檢查它,該函數提供了內存中變量的引用ID。