Python 3.8 二维数组拼接正在产生奇怪的结果.拼接是使列表指向内存



我的目的是顺时针旋转列表1并将其打印为list2。 有关相同的内容,请参阅下面的代码。 每当我执行此操作时,我的问题是代码的第三行,list1 和 list2 指向同一位置。据我所知,如果我写 list1 = list2 会这样做,但是切片 list2 =list1[:] 应该生成列表 2 列表 1 的副本。有人可以帮助我吗?

# Python 3.8
list1 = [[1,2,3],[4,5,6],[7,8,9]]
print (list1[0],list1[1],list1[2],sep='n')
list2 = list1[:][:]
for i in range(3):
for j in range(3):
list2[i][j] = list1[2-j][i]
print ('n_________n')
print (list2[0],list2[1],list2[2],sep='n')
print ('n_________n')
print (list1[0],list1[1],list1[2],sep='n')

输出

[1, 2, 3]

[4, 5, 6]

[7, 8, 9]


[7, 4, 7]

[8, 5, 4]

[9, 4, 7]


[7, 4, 7]

[8, 5, 4]

[9, 4, 7]

Python 有深拷贝和浅拷贝的概念。 在您的情况下,切片操作会生成 list1 的浅表副本。

>>> list1 = [[1,2,3],[4,5,6],[7,8,9]]
>>> print (list1[0],list1[1],list1[2],sep='n')
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
>>>
>>> list2 = list1[:][:]
>>> list2
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> id(list1)
2123959541504
>>> id(list2)
2123959572032
>>> id(list1[0])
2123958209920
>>> id(list2[0])
2123958209920

请注意每一行如何指向相同的内存位置,因此更改 list2 中的行元素也会更改 list1。

你可以改用python的复制库

>>> from copy import deepcopy
>>> list2 = deepcopy(list1)
>>> id(list2[0])
2123959574016
>>> id(list1[0])
2123958209920

最新更新