相关疑难解决方法(0)

使用乘法(*)意外行为生成子列表

我确信这已在某个地方得到解答,但我不确定如何描述它.

假设我想创建一个包含3个空列表的列表,如下所示:

lst = [[], [], []]
Run Code Online (Sandbox Code Playgroud)

这样做我以为我很聪明:

lst = [[]] * 3
Run Code Online (Sandbox Code Playgroud)

但是我发现,在调试了一些奇怪的行为之后,这导致了对一个子列表的追加更新,比如lst[0].append(3),更新整个列表,[[3], [3], [3]]而不是[[3], [], []].

但是,如果我用列表初始化列表

lst = [[] for i in range(3)]
Run Code Online (Sandbox Code Playgroud)

然后做lst[1].append(5)了预期的[[], [5], []]

我的问题是为什么会发生这种情况?有趣的是,如果我这样做

lst = [[]]*3
lst[0] = [5]
lst[0].append(3)
Run Code Online (Sandbox Code Playgroud)

那么单元格0的"连接"就被打破了[[5,3],[],[]],但是我得到了,但lst[1].append(0)仍然会导致[[5,3],[0],[0].

我最好的猜测是在表单中使用乘法[[]]*x会导致Python存储对单个单元格的引用......?

python list mutable nested-lists

11
推荐指数
3
解决办法
1357
查看次数

标签 统计

list ×1

mutable ×1

nested-lists ×1

python ×1