Python中二维列表的“克隆”技巧

因为课程要求,D酱开始学习Python了。今天在操作Python列表的过程中遇到了一些问题。

a = [0,1,2,3,4]
b = a

这看起来是一种很正确的赋值b的方式,但在这种操作下,b实际上成为了a的“别名”,类似C语言里的“指针”,用id查看就会发现ab其实指向同一个变量。

此时如果对b进行操作,a也会发生改变。

但很多时候,我们定义额外变量的目的就是要对其进行单独的操作。对此,老师讲义上给出的方法是用切片进行赋值。

a = [0,1,2,3,4]
b = a[:] '对a全部切片'

看起来是管用的,但事实上,在实际操作中,D酱发现切片克隆只对一维列表生效,对二维列表就无能为力了。

a = [[0,1,2],[3,4]]
b = a[:]

可以看到,虽然abid确实发生了变化,但其中的元素的id并没有发生改变,进行操作时仍会同时发生变化。并且这与切片次数无关。

切两片
切三片

难道二维列表就要一个个append了吗,并不是,我们还可以用调用deepcopy来实现二维列表的复制。

深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
import copy '引入copy'
a = [[0,1,2],[3,4]]
b = copy.deepcopy(a)

切片赋值相当于copy.copy(浅拷贝), a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象;而copy.deepcopy(深度拷贝), a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

Quin_Meow

阿巴阿巴阿巴

相关推荐

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

微信扫一扫,分享到朋友圈

Python中二维列表的“克隆”技巧
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close