2017-01-16 118 views
2

如果我建一個嵌套列表:爲什麼`a + = x`和`a = a + x`爲嵌套列表實現不同?

nested_list = 3*[[]] 

,如果我再添加元素,它

  1. nested_list[1] += [1, 2, 3]。返回:[[1,2,3],[1,2,3],[1,2,3]]
  2. nested_list[1] = nested_list[1] + [1, 2, 3]。返回:[[],[1,2,3],[]]

我希望能夠獲得第2種情況的結果。

爲什麼我會在情況1中獲得不同的結果?這是python的設計選擇嗎?情況1的結果的邏輯是什麼?

+4

這裏的核心問題是'nested_list = 3 * [[]]'是創建列表列表的不好方法:http://stackoverflow.com/q/240178/3001761 – jonrsharpe

回答

4

在第一個例子中,您更新參考nested_list[1]。由於所有3個插槽都使用相同的參考,因此您會看到您的更改3次。

在第二個示例中,您沒有就地追加:您爲nested_list[1]創建另一個引用,它只更新列表列表的中間位置,而其他位置則保留舊的引用。

注意nested_list = 3*[[]]構建一個嵌套列表並不是很有用。您可能希望創建這樣所有子列表單獨引用:

nested_list = [[] for _ in range(3)] 

現在,這兩個操作產生相同的結果(但首選方法是nested_list[1] += ...,因爲它是方式更好的性能)

這並不適用到不可變對象像字符串,整數,浮點數,其中*運算符不是問題。應用就地添加只會更改其適用的項目。

相關問題