python 复制列表的六种方法

以下是对列表的六种复制方式,总结来说在复制时有三种原理,其中 l 1 l1 l1 是一种, l 6 l6 l6 是第二种,其他的四个方法属于第三种。

import copy
l = [1, 2, [3, 4]]
l1 = l
l2 = l.copy()
l3 = l[:]
l4 = list(l)
l5 = copy.copy(l)
l6 = copy.deepcopy(l)

我们可以先来打印它们的地址:

print(id(l))
print(id(l1))
print(id(l2))
print(id(l3))
print(id(l4))
print(id(l5))
print(id(l6))
2515754890952
2515754890952
2515754891912
2515754910792
2515754891208
2515754863048
2515754910984

由此可以看出, l 1 l1 l1 的复制原理是将 l l l 的地址也一并复制过去了,也就是说,当 l l l 发生改变时, l 1 l1 l1 也会改变。但其他的复制方式则不会发生这个问题,比如:

l[0] = 0
print('l: ', l)
print('l1: ', l1)
print('l2: ', l2)
print('l3: ', l3)
print('l4: ', l4)
print('l5: ', l5)
print('l6: ', l6)

得到:

l:  [0, 2, [3, 4]]
l1:  [0, 2, [3, 4]]
l2:  [1, 2, [3, 4]]
l3:  [1, 2, [3, 4]]
l4:  [1, 2, [3, 4]]
l5:  [1, 2, [3, 4]]
l6:  [1, 2, [3, 4]]

但是,如果我们针对 l l l 内部的子列表做出改变时,只有 l 6 l6 l6 会仍然保持不变,如:

import copy
l = [1, 2, [3, 4]]
l1 = l
l2 = l.copy()
l3 = l[:]
l4 = list(l)
l5 = copy.copy(l)
l6 = copy.deepcopy(l)
l[2][0] = 0
print('l: ', l)
print('l1: ', l1)
print('l2: ', l2)
print('l3: ', l3)
print('l4: ', l4)
print('l5: ', l5)
print('l6: ', l6)
l:  [1, 2, [0, 4]]
l1:  [1, 2, [0, 4]]
l2:  [1, 2, [0, 4]]
l3:  [1, 2, [0, 4]]
l4:  [1, 2, [0, 4]]
l5:  [1, 2, [0, 4]]
l6:  [1, 2, [3, 4]]

所以,总结来说:

  • l 1 = l l1 = l l1=l:当 l l l 变化时, l 1 l1 l1 也会变化。
  • l 2 = l . c o p y ( ) l2 = l.copy() l2=l.copy() l 3 = l [ : ] l3 = l[:] l3=l[:] l 4 = l i s t ( l ) l4 = list(l) l4=list(l) l 5 = c o p y . c o p y ( l ) l5 = copy.copy(l) l5=copy.copy(l):当 l l l 中的单个数字发生变化时, l 2 l2 l2 l 3 l3 l3 l 4 l4 l4 l 5 l5 l5 都不会改变;当 l l l 中的子列表发生变化时, l 2 l2 l2 l 3 l3 l3 l 4 l4 l4 l 5 l5 l5 都会改变。
  • l 6 = c o p y . d e e p c o p y ( l ) l6 = copy.deepcopy(l) l6=copy.deepcopy(l):无论 l l l 怎么变化, l 6 l6 l6 都不会变。
  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cofisher

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

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

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

打赏作者

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

抵扣说明:

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

余额充值