2017-03-04 123 views
-1

當我輸入t=[[False]*2]*2時,我得到列表[[False, False], [False, False]]。但是當我輸入t[0][0] = True時,t[1][0]也更改爲True,讓我與[[True, False], [True, False]]。我只想要[[True, False], [False, False]]。作爲第二種選擇,我可以分配t=[[False]*2, [False]*2],然後更改t[0][0] = True得到我想要的([[True, False], [False, False]]),但是我的真實名單比這個大得多,所以我寧願不使用選項2.我認爲這是一個類似的問題到克隆,而使用列表複製,所以我嘗試: ([[False]*2])*2Python:如何在不克隆的情況下複製複製列表

([False]*2)*2

[[False]*2][:]*2

t = [False]*2 t = t*2

list([False]*2)*2

list([[False]*2])*2

[list([False]*2)]*2。這些都沒有奏效。有沒有辦法做到這一點,而無需導入任何包?

回答

0

如果使用列表理解來構建列表,則每個列表對象都將指向一個唯一地址,而不是共享相同的引用。

t = [[False for x in range(2)] for y in range(2)] 
t[0][0] = True 
t # [[True, False], [False, False]] 
+0

當然!我在其他地方使用了列表理解,但是我忘記了在這裏使用它。順便說一句,'xrange'在Python 3中不起作用(它只是'range')。但是,如果沒有列表理解,真的沒有辦法做到這一點嗎? –

+0

@ P.Gordy還有'itertools.repeat(val,numberoftimes)',但是列表理解會更快。如果你嵌套'重複',那麼它變得很難看。 – MSeifert

+1

'[範圍(2)中的x的錯誤]'實際上可以是'[False] * 2'。只有第二個人需要在範圍(2)'中有'y'。 –