因为课程要求,D酱开始学习Python了。今天在操作Python列表的过程中遇到了一些问题。
a = [0,1,2,3,4]
b = a
这看起来是一种很正确的赋值b
的方式,但在这种操作下,b
实际上成为了a
的“别名”,类似C语言里的“指针”,用id
查看就会发现a
和b
其实指向同一个变量。
此时如果对b
进行操作,a
也会发生改变。
但很多时候,我们定义额外变量的目的就是要对其进行单独的操作。对此,老师讲义上给出的方法是用切片进行赋值。
a = [0,1,2,3,4]
b = a[:] '对a全部切片'
看起来是管用的,但事实上,在实际操作中,D酱发现切片克隆只对一维列表生效,对二维列表就无能为力了。
a = [[0,1,2],[3,4]]
b = a[:]
可以看到,虽然a
和b
的id
确实发生了变化,但其中的元素的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 完全拷贝了父对象及其子对象,两者是完全独立的。