2024-04-23 08:36:52 发布
网友
在这里, 我想更改第二个嵌套列表的第一个元素,但是。你知道吗
L1=list('| |') L2=[L1,L1] print L2 >>>[ [ '|', ' ', ' ', '|' ], [ '|', ' ', ' ', '|' ] ] L2[1][0]='@' print L2 >>>[ [ '@', ' ', ' ', '|' ], [ '@', ' ', ' ', '|' ] ]
它改变了嵌套列表!! 我错在哪里??你知道吗
问题在于:
L1 = list('| |') L2 = [L1, L1] for item in L2: print(id(item)) # -> twice the same id.
您将构建一个新列表,其中包含对相同的列表的两个引用。对该列表的更改将反映在L2的两个项中。你知道吗
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])会给你同样的结果。你知道吗
id(L2[0][0])
id(L2[1][0])
另一种选择
import copy L2 = [L1, copy.copy(L1)]
问题在于:
您将构建一个新列表,其中包含对相同的列表的两个引用。对该列表的更改将反映在
L2
的两个项中。你知道吗你可能想做的是:
现在
按预期工作。你知道吗
当创建一个包含两个相同列表的列表时,并不是创建两个独立的子列表,而是创建一个引用内存中相同列表的列表。因此,改变一个,改变另一个:
项目重新分配是一个就地操作,它更改内存中的子列表,而不将其重新分配给其他对象。这会导致你的行为
我猜你的第二行是
通过这样做,您不会将L1值传递给L2,而是两次传递引用。它们指向同一个地方。
id(L2[0][0])
和id(L2[1][0])
会给你同样的结果。你知道吗另一种选择
相关问题 更多 >
编程相关推荐