python对象的浅拷贝和深拷贝

来源:互联网 发布:thunder mac 破解版 编辑:程序博客网 时间:2024/05/21 17:33

      python 浅拷贝和深拷贝的操作在copy模块中,这里面有两个函数:copy()进行浅拷贝操作,deepcopy进行深拷贝操作。

      浅拷贝其实就是创建了一个类型跟原对象一样,其内容是原来对象的引用。换句话说,这个拷贝的对象本身是新的,但是它的内容不是。序列类型对象的浅拷贝是默认类型拷贝,并可以以下几种方式实施(1)完全切片操作[:];(2)利用工厂函数,比如list()、dict()等;(3)使用copy模块的copy函数。

 

>>> person = ['name', ['savings', 100.00]]
>>> hubby = person[:]  # slice copy,方法(1)
>>> wifey = list(person) # fac func copy 方法(2)

>>> son = copy.copy(person)
>>> [id(x) for x in person, hubby, wifey,son]  # 不同的对象
[18806464, 18565200, 18783888, 18770680]

>>> [id(x) for x in person]     # 以下内容相同
[11226976, 18769360]

>>> [id(x) for x in hubby]
[11226976, 18769360]
>>> [id(x) for x in wifey]

[11226976, 18769360]
>>> [id(x) for x in son]

[11226976, 18769360]

 

      要得到一个完全拷贝或者说深拷贝——创建一个新的容器对象,包含原有对象元素(引用)全新拷贝的引用.

 

>>> dau = copy.deepcopy(person)
>>> id(dau)                     # 新对象
13684168

>>> [id(x) for x in dau]   # 不同内容
[11226976, 13681408]

 

注意:1)非容器类型(比如数字、字符串和其他“原子”类型的对象,像代码、类型和xrange对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成的。

 

2)如果元组变量只包含原子类型对象,对它的深拷贝将不会进行。如果我们把账户信息改成元组类型,那么即便按我们的要求使用深拷贝操作也只能得到一个浅拷贝。

 

>>> person = ['name', ('savings', 100.00)]
>>> newPerson = copy.deepcopy(person)
>>> [id(x) for x in person, newPerson]
[18770240, 18762368]
>>> [id(x) for x in person]
[11226976, 18758272]
>>> [id(x) for x in newPerson]
[11226976, 18758272]

原创粉丝点击