2011-11-20 154 views
8

我對理解列表的行爲有輕微的問題。將列表分配給該列表中的一個值

我的鍛鍊問題是: 繪製內存模型顯示出下面的語句的效果:

values = [0, 1, 2] 
values[1] = values 

我的想法是,在執行這些語句將列表更改爲類似這樣[0, [0, 1, 2], 3] ,在換句話說,第二條語句將在列表(1)中附加第二個值,但是當我執行這些語句並在Python shell(3.2)中打印出列表時,我得到以下結果:

[0, [...], 2] 

第二次進入發生了一些事情,但我不確定究竟是什麼,有人可以解釋發生了什麼?

謝謝 達米安

回答

13

您已經創建了遞歸數據結構。列表中的第二個元素是對列表本身的引用。當你打印出來的時候,通常你會希望看到第二位的原始列表,正如你在你的問題中提出的那樣。

但是,你是不是插入原始列表的副本,要插入參考實際列表。所以,第二個元素必須打印出整個列表。但是,第二個元素的第二個元素本身就是對列表的引用,所以當它打印的第二個元素時,....通過顯示[...]來優雅地處理這個問題,因爲唯一的另一個解決方案是呈現無限的嵌套列表。

想象一下這樣說:你分配給values[1]後,您的列表可以被認爲是看起來像這樣:

[0, <pointer to itself>, 2] 

當然,<pointer to itself>,在打印時,看起來像:

[0, <pointer to itself>, 2] 

當你把這些放在一起,你得到:

[0, [0, <pointer to itself>, 2], 2] 

但當然,以打印最裏面<pointer to itself>它也必須印:

[0, [0, [0, <pointer to itself>, 2], 2], 2] 

...等等。它一直在下降。

+0

龜爲+1 :) –

+0

@Bryan Oakley,謝謝你的回答,這是一個很好的解釋。這一切都歸結爲參考/複製,我需要更加警惕。 –

3

你是從字面上插入一個列表到自身。結果列表不能再打印,因爲它有點變了一圈:

values = [0, 1, 2] 
values[1] = values 
# so the list now looks like 
[0, values, 2] 
# so we expand the variable and get 
[0, [0, values, 2], 2] 
# and so on 
[0, [0, [0, values, 2], 2], 2] 
# as this will never end instead Python prints 
[0, [...], 2] 

所以[...]意味着該列表包含本身。

0

,爲你工作的一個是:

values = [0, 1, 2] 
values[1] = values[:] # or list(values) 

對於複製列表和引用的更多信息見here

+2

我投下了票,因爲這沒有回答這個問題。問題不在於如何在列表中存儲列表的副本。問題是,「解釋當你將列表中的元素設置爲對自身的引用時會發生什麼。」這個答案沒有解釋,只是一個解決方法。雖然你所說的是非常有用的建議,但在這個問題的背景下它並沒有用。 –

+1

@Bryan Oakley:儘管它沒有回答原來的問題,但這是唯一一個實際告訴你如何去做的條目,而實用的方法絕對值得讚賞。 –