Python列表乘法操作的深浅复制

        由于Python采用的是基于值的自动内存管理方式,所以以列表为例,列表中包含的是元素值的引用,而不是直接包含元素值,所以在利用乘法进行列表的拓展复制后进行元素修改时,会出现“难以理解的操作”,如下代码:

ls1 = ["hello"]
ls2 = [ls1*2]*3
print(ls2) #[['hello', 'hello'], ['hello', 'hello'], ['hello', 'hello']]
ls2[0][0] = "hi"
print(ls2) #[['hi', 'hello'], ['hi', 'hello'], ['hi', 'hello']]

        运行代码后可以发现,我们对列表ls2进行第一个元素的修改时,每行的第一个元素竟都发生了改变,这就涉及到python深浅复制的问题了。        

        而我们编写此段的程序的初衷是想生成一个3*2的列表,其中的元素修改互不干扰,而如果利用乘法进行复制操作显然会出现错误,所以可以借助for循环来实现预期的操作,代码如下:

ls1 = ["hello"]
ls2 = []
for i in range(3):
    temp = []
    for j in range(2):
        temp.append(ls1[0])
    ls2.append(temp)
print(ls2)
#[['hi', 'hello'], ['hi', 'hello'], ['hi', 'hello']]
ls2[0][0] = "hi"
print(ls2)
#[['hi', 'hello'], ['hello', 'hello'], ['hello', 'hello']]

          这样一来就可以完美实现我们预期的结果,修改新列表的各个元素之间不会产生“连锁反应”。

        进一步,我们还可以利用python独特的列表推导式来化简写法,代码如下:

ls1 = ["hello"]
ls2 = [[ls1 for i in range(2)] for j in range(3)]
print(ls2)
#[['hi', 'hello'], ['hi', 'hello'], ['hi', 'hello']]
ls2[0][0] = "hi"
print(ls2)
#[['hi', 'hello'], ['hello', 'hello'], ['hello', 'hello']]

猜你喜欢

转载自blog.csdn.net/m0_58136789/article/details/126689521