相关疑难解决方法(0)

列表更改意外地反映在子列表中

我需要在Python中创建一个列表列表,所以我输入以下内容:

myList = [[1] * 4] * 3
Run Code Online (Sandbox Code Playgroud)

列表看起来像这样:

[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]  
Run Code Online (Sandbox Code Playgroud)

然后我改变了最里面的一个值:

myList[0][0] = 5
Run Code Online (Sandbox Code Playgroud)

现在我的列表看起来像这样:

[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]  
Run Code Online (Sandbox Code Playgroud)

这不是我想要或期望的.有人可以解释一下发生了什么,以及如何解决这个问题?

python list mutable nested-lists

576
推荐指数
10
解决办法
3万
查看次数

嵌套列表索引

我在Python中使用嵌套列表时遇到了一些问题.

基本上,我有一个包含所有0值的2D列表,我想在循环中更新列表值.

但是,Python不会产生我想要的结果.有什么我误解range()和Python列表索引?

some_list = 4 * [(4 * [0])]
for i in range(3):
    for j in range(3):
        some_list[i+1][j+1] = 1
for i in range(4):
    print(some_list[i])
Run Code Online (Sandbox Code Playgroud)

我期望的结果是:

[0, 0, 0, 0]
[0, 1, 1, 1]
[0, 1, 1, 1]
[0, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)

但是Python的实际结果是:

[0, 1, 1, 1]
[0, 1, 1, 1]
[0, 1, 1, 1]
[0, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

python python-3.x

11
推荐指数
2
解决办法
4112
查看次数

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

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

假设我想创建一个包含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
查看次数

Python - 使用乘法运算符创建列表中的对象副本

在Python中,如果我将对象列表乘以整数,我会得到一个对该对象的引用列表,例如:

>>> a = [[]] * 3
>>> a
[[], [], []]
>>> a[0].append(1)
>>> a
[[1], [1], [1]]
Run Code Online (Sandbox Code Playgroud)

如果我想要的行为是创建原始对象的副本列表(例如,通过"copy.copy()"方法或某种标准创建的副本,是否有一种优雅的方法可以使用相同的乘法运算符执行此操作?或者我应该坚持列表理解还是什么?例如

[[] for x in range(0,3)]
Run Code Online (Sandbox Code Playgroud)

任何版本的Python都可以.

python list

8
推荐指数
2
解决办法
7272
查看次数

关于python列表初始化的有趣的事情

我很安静,因为下面用python来解决这个问题

>>> a = [[]]*3
>>> c=[[],[],[]]
>>> a
[[], [], []]
>>> c
[[], [], []]
>>> a == c
True
>>> a[1].append(2)
>>> a
[[2], [2], [2]]
>>> c[1].append(2)
>>> c
[[], [2], []]
Run Code Online (Sandbox Code Playgroud)

我猜的原因是在变量a中,所有三个列表都会向相同的内存区域发送,直到它们以不同的方式使用.这样对吗?使用*运算符之类的东西进行初始化时,我是否应该始终小心?谢谢!

python list

5
推荐指数
1
解决办法
88
查看次数

标签 统计

python ×5

list ×4

mutable ×2

nested-lists ×2

python-3.x ×1