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

Python3.8二维数组拼接正在产生奇怪的结果。拼接是使列表指向内存,python,list,slice,Python,List,Slice,我的目的是顺时针旋转列表1并将其打印为列表2。请参见下面的代码以获取相同的信息。 我的问题是,每当我执行此操作时,第三行代码的列表1和列表2都指向同一位置。据我所知,如果我写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 = list

我的目的是顺时针旋转列表1并将其打印为列表2。请参见下面的代码以获取相同的信息。 我的问题是,每当我执行此操作时,第三行代码的列表1和列表2都指向同一位置。据我所知,如果我写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
请注意,每一行如何指向相同的内存位置,因此更改列表2中的行元素也将更改列表1

您可以改为使用python的复制库

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

请将标题读为切片,而不是切片。预期输出是什么?预期输出是7 4 1 8 5 2 9 6 3