2017-01-16 80 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] += ...,因为它是方式更好的性能)

这并不适用到不可变对象像字符串,整数,浮点数,其中*运算符不是问题。应用就地添加只会更改其适用的项目。

相关问题