2013-07-31 138 views
0

變量引用和賦值

c = 10 
a = b = c 

現在a,b參考c,所以我想如果c變化,所以會a,b,像

c = 123 # change c, then a = b = 123 

但實際上,a,b根本不會改變,爲什麼?現在考慮一份清單

m = [0] 
l = [m]*3 
l[0][0] = 1 # just change l[0][0], then l[1:] change 

爲什麼?

回答

6

ab參考c,他們三個人都引用一個對象10

這意味着,執行c = 123不會改變物體背後c,它只會在一個新的對象123c,留下ab孤單。

換句話說,你原來:

a ---+ 
    | 
b ---+---> 10-object 
    | 
c ---+ 

和執行c = 123變化,爲:

a ---+ 
    | 
b ---+---> 10-object 

c -------> 123-object 

越早掌握了Python真的完全面向對象的,更快的你我會說一句:-)

你的第二個樣本改變所有元素的原因l是因爲在l列表中的所有項目引用單個list1而非不同背襯對象:

l -------> list2 {list1, list1, list1} 
m -------> list1 {0-object} 

執行l[0][0] = 1是相同的執行m[0] = 1(見下文),這不會改變結合m其列表或內list2這些項目以list1結合,而是簡單地改變內list2項目是一個1-object

l -------> list2 {list1, list1, list1} 
m -------> list1 {1-object} 

因此,您可以看到對list1的內容所做的更改會影響所有內容。可見l[0][0]m[0]是等價的成績單如下:

>>> m = [0] 
>>> l = [m] * 3 
>>> m 
[0] 

>>> l 
[[0], [0], [0]] 

>>> l[0][0] = 1 
>>> l 
[[1], [1], [1]] 

>>> m 
[1] 

>>> m[0] = 42 
>>> l 
[[42], [42], [42]] 

請注意,如果你改變了結合的m,是不會改變的實際綁定在list2

>>> m = [999] 
>>> l 
[[42], [42], [42]] 

當你這樣做,你最終:

l -------> list2 {list1, list1, list1} 
      list1 {42-object} 
m -------> list3 {999-object} 
+0

你的答案是如此之好...我只希望問題標題更具描述性,以便更多的人更有可能找到這個答案。 – SethMMorton

+0

非常感謝。 – Alcott