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']]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌木_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值