赋值与复制
Python 中的复制可以分为浅复制和深复制。
Python 的不少对象本质上是一个 C 指针(参考:值传递和引用传递),其指向 Python 虚拟机分配内存的一个区域。使用函数 id 可以查看两者指向内存的编号,若两者指向同一块内存,则编号相同。
这里,我们先定义一个列表 l 如下:
d = {'a': 1, 'b': 2}
l = [1, 23, 'abc', d]
直接赋值
可以使用等号 = 直接赋值一个列表,定义如下:
l2 = l
赋值本质上只是创建了一个新的指针,这个指针依然指向原区域。使用 id 函数可以看出两者 ID 相同:
>>> id(l2) == id(l)
True
或者可以用 is 检查两者是否为指向同一内存的不同指针:
>>> l2 is l
True
浅复制
浅复制(shallow copy)可以对一个容器进行复制。它会创建一个新的对象,但不会进一步改变对象的子对象。
使用 copy 类的 copy 函数,或者某些类型的 .copy 方法可以进行浅复制:
import copy
l3 = l.copy()
l4 = copy.copy(l)
此时就创建了 l3,l4 作为 l 的浅拷贝。
浅拷贝的列表是新创建的,但是列表内本质还是储存了一些指针,这些指针指向一个 Python 对象。因此,列表内的元素并没有复制,这里两者的 3 号元素(字典)依然是同一个对象:
>>> l3[3] is l[3]
True
深复制
深复制(deep copy)则不仅仅复制对象本身,还递归复制了这一对象储存的所有子对象。对于大型结构,其内部的对象(指针)也将指向新的内存区域。
import copy
l5 = copy.deepcopy(l)
BEYOND THE ARTICLE
读完了,有什么想法?
阅读已保存的问答示例,并循着引用回到原文。
— 本文完 — 返回文章列表