在这种情况下如何更改2d列表中的元素

时间:2017-01-03 15:46:09

标签: python arrays list 2d

在此, 我想改变第二个嵌套列表的第一个元素,但是。

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

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

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

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

它改变了嵌套列表!! 我错的地方?

4 个答案:

答案 0 :(得分:2)

我假设你的第二行是

L2 = [L1, L1]

通过执行此操作,您不会将L1值传递给L2,而是传递两次。他们指向同一个地方。 id(L2[0][0])id(L2[1][0])会给你一样的。

替代

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

答案 1 :(得分:0)

问题是:

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

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

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

您可能想要做的是:

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

现在

L2[1][0]='@'

按预期工作。

答案 2 :(得分: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

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

答案 3 :(得分:0)

您可以使用列表切片来处理原始列表的副本,而不是使用第二个列表中的原始列表。请查看以下示例以获取更多详细信息:

没有列表切片:

>>> l1 = ['a', 'b']
>>> l2 = [l1, l1]
>>>
>>> l2[1][0] = 'x'
>>> l2
[['x', 'b'], ['x', 'b']] # both sub-lists are changed

现在,使用列表切片:

>>> l3 = ['a', 'b']
>>> l4 = [l3[:], l3[:]]
>>>
>>> l4[1][0] = 'x'
>>> l4
[['a', 'b'], ['x', 'b']]  # only the second sub-list is changed