我的意图是顺时针旋转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具有深层复制和浅层复制的概念。根据您的情况,切片操作会生成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