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

问题描述 投票:1回答:1

我的意图是顺时针旋转list1并将其打印为list2。参见以下代码。我的问题是每当我执行此操作时,代码的第三行list1和list2指向同一位置。据我所知,如果我写list1 = list2会做到这一点,但是切片list2 = list1 [:]应该产生list2的副本list1。有人可以帮我吗?

# 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 arrays list slice
1个回答
1
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.