2013-04-01 156 views
0

爲什麼不行?爲什麼我不能在列表中更改列表?

In [28]: my_list_o_lists = [ [], ["cow", "says", "moo"], [1, 2, 3] ] 

In [29]: print(my_list_o_lists) 
[[], ['cow', 'says', 'moo'], [1, 2, 3]] 

In [30]: m0 = my_list_o_lists[0] 

In [31]: m0 = [ "Where is my cow?", "No idea!" ] 

In [32]: print(my_list_o_lists) 
[[], ['cow', 'says', 'moo'], [1, 2, 3]] 

我想將列表中的第一項更改爲第31行中發佈的另一個列表,但它不起作用。非常困惑和谷歌搜索沒有幫助。

我在蟒2.7.3(在上述例子中使用的IPython 0.13.1)。

+0

爲什麼不只是做'my_list_o_lists [0] = [ 「哪裏是我的牛?」, 「不知道!」 ]'? – TerryA

+0

您只是將'm0'分配給另一個列表,而不是原來的列表。做my_list_o_lists [0] = [「我的牛在哪裏?」,「不知道!」]''而不是。 – Volatility

+1

因爲在第30行,你有它倒退。你只是將變量'mo'綁定到'my_list_o_lists [0]'它不是一個指針,例如C。 – dawg

回答

1

這是因爲m0my_list_o_lists[0]的價值,而不是對它的引用。
所以,操作m0不會影響my_list_o_lists[0]
看到這個:

>>> my_list_o_lists = [ [], ["cow", "says", "moo"], [1, 2, 3] ] 
>>> m0 = my_list_o_lists[0] 
>>> m0 = [ "Where is my cow?", "No idea!" ] 
>>> print m0 
['Where is my cow?', 'No idea!'] 
>>> print my_list_o_lists[0] 
[] 

爲了解決這個問題,只是操控my_list_o_lists[0],而不是操縱m0
否則,您可以操作m0,併爲其指定值my_list_o_lists[0]
喜歡的東西:

>>> my_list_o_lists[0] = m0 
+0

謝謝,現在有道理。 – Sonderbun

2

你不更改列表,你重新綁定m0名新的列表。要更改列表,您需要更改其內容(如m0.append(''))或將my_list_o_lists[0]替換爲新列表(如my_list_o_lists[0] = [''])。

1

m0是一個變量,不是指向my_list_o_lists的索引0的指針。更改m0不會影響my_list_o_lists。 如果你想更換my_list_o_lists [0],你需要做的

my_list_o_lists[0] = m0

的完整代碼應該是這樣的:

my_list_o_lists = [ [], ["cow", "says", "moo"], [1, 2, 3] ] 
m0 = [ "Where is my cow?", "No idea!" ] # Assigning value to variable m0 
my_list_o_lists[0] = m0     # Assigning value of m0 to list index 0 
0

兩個變量名指向一個列表只有在全列表被分配給另一個。如)

a=[1,2,3,4] 
b=a 
b.append(10) 
print a 

輸出

[1,2,3,4,10] 

但因爲你只分配列表的一個元素,新的變量指向不同的地址,這樣的變化不能正常工作。所以使用

my_list_o_lists[0]=[''] 

試試這個

a=[[],[],[]] 
b=a 
b[0]=[1,2,3,4] 
print a 
1

問題與您正在使用的變量m0做。在Python中,變量只是附加到對象的名稱。如果分配給變量,則只需將該名稱附加到不同的對象。

在這種情況下,你第一次在my_list_o_lists[0]連接名稱m0對象。然後在下一步中,您將名稱重新綁定到新的列表對象。這不會使原始對象(仍在my_list_o_lists中)消失,也不會更改原始對象。只有名稱m0被移動。

如果你想解決你的問題,你需要做兩件事之一。無論是重新分配的my_list_o_lists[0]內容直接:

my_list_o_lists[0] = [ "Where is my cow?", "No idea!" ] 

或者修改現有的列表到位,而不是取代它:

m0 = my_list_o_lists[0] 
m0[:] = [ "Where is my cow?", "No idea!" ] # slice assignment reuses the list 
+0

有趣。我知道你可以使用「new_list = old_list [:]」來複制一個列表,但不能以這種方式使用它。 – Sonderbun

0

你擁有了它亂序一點。嘗試是這樣的:

>>> m0=['Where is my cow?', 'No idea!'] 
>>> LoL=[ [], ["cow", "says", "moo"], [1, 2, 3] ] 
>>> LoL[0]=m0 
>>> LoL 
[['Where is my cow?', 'No idea!'], ['cow', 'says', 'moo'], [1, 2, 3]] 

或者:

>>> LoL=[m0, ["cow", "says", "moo"], [1, 2, 3] ] 
>>> LoL 
[['Where is my cow?', 'No idea!'], ['cow', 'says', 'moo'], [1, 2, 3]] 
相關問題