如何在这个cas中更改2d列表中的元素

2024-04-23 08:36:52 发布

您现在位置:Python中文网/ 问答频道 /正文

在这里, 我想更改第二个嵌套列表的第一个元素,但是。你知道吗

L1=list('|  |')
L2=[L1,L1]
print L2

>>>[ [ '|', ' ', ' ', '|' ], [ '|', ' ', ' ', '|' ] ]

L2[1][0]='@'
print L2

>>>[ [ '@', ' ', ' ', '|' ], [ '@', ' ', ' ', '|' ] ]

它改变了嵌套列表!! 我错在哪里??你知道吗


Tags: 元素l1列表listprintl2
3条回答

问题在于:

L1 = list('|  |')
L2 = [L1, L1]

for item in L2:
    print(id(item))  # -> twice the same id.

您将构建一个新列表,其中包含对相同的列表的两个引用。对该列表的更改将反映在L2的两个项中。你知道吗

你可能想做的是:

L2 = [list('|  |'), list('|  |')]

现在

L2[1][0]='@'

按预期工作。你知道吗

当创建一个包含两个相同列表的列表时,并不是创建两个独立的子列表,而是创建一个引用内存中相同列表的列表。因此,改变一个,改变另一个:

In [18]: L1=list('|  |')

In [19]: id(L1)
Out[19]: 4388545160

In [20]: L2 = [L1, L1]

In [21]: id(L2)
Out[21]: 4389336520

In [22]: for sub in L2: print(id(sub))
4388545160
4388545160

项目重新分配是一个就地操作,它更改内存中的子列表,而不将其重新分配给其他对象。这会导致你的行为

我猜你的第二行是

L2 = [L1, L1]

通过这样做,您不会将L1值传递给L2,而是两次传递引用。它们指向同一个地方。id(L2[0][0])id(L2[1][0])会给你同样的结果。你知道吗

另一种选择

import copy
L2 = [L1, copy.copy(L1)]

相关问题 更多 >