Python copy 模块 引用 浅拷贝 深拷贝

Python中一切都是对象,变量中存放的是对象的引用。

引用(赋值)只是复制了原对象的引用,不会开辟新的内存空间。

引用方式:

  1. = 赋值符号

浅拷贝(shallow copy)是指原对象的引用拷贝。创建了新对象,其内容为原对象的引用。

浅拷贝方式

  1. list[:]切片操作
  2. dict().copy() 字典的copy方法
  3. list(L) 内置函数
  4. copy.copy() copy模块函数

深拷贝(deep copy)拷贝原对象中所有元素,包括多层嵌套。得到的新对象是一个全新对象,与原对象无任何联系。

深拷贝方式

  1. copy.deepcopy() copy模块函数

引用、浅拷贝、深拷贝区别:

  • 引用完全复制原对象,对引用得到的新对象的改变会对原对象产生相同的改变。
  • 浅拷贝只拷贝了一层对象,即只拷贝父对象,不会拷贝原对象内部的子对象。浅拷贝不随原对象最外层对象变化而变化。
  • 深拷贝拷贝了所有元素,即拷贝了原对象及其子对象。不随原对象发生任何变化。

对于简单的原对象而言深/浅拷贝没区别,而原对象当中嵌套子对象,则浅拷贝只会拷贝最外层,深拷贝会全部拷贝。

例子:

>>> import pandas as pd
>>> import copy
# example 1
>>> a = pd.DataFrame([1,1])
>>> b=a
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> a
   0
0  1
1  1
>>> c
   0
0  1
1  1
>>> a.loc[1]=2
a :0 |b :0 |c :0 |d :0
0  1 |0  1 |0  1 |0  1
1  2 |1  2 |1  1 |1  1
>>> b[1]=2
b :0  1 |a :0  1
0  1  2 |0  1  2
1  2  2 |1  2  2
c :0 |d :0
0  1 |0  1
1  1 |1  1
>>> c[2]=2
c :0  2
0  1  2
1  1  2
d :0
0  1
1  1
a :0  1
0  1  2
1  2  2
# example 2
>>> a = [1,2,3,[5,6]]
>>> a=b
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> a[2][1]='a'
a : [1, 2, [3, 'a']]
b : [1, 2, [3, 'a']]
c : [1, 2, [3, 'a']]
d : [1, 2, [3, 4]]
>>> a.append(6)
a : [1, 2, [3, 'b'], 6]
b : [1, 2, [3, 'b'], 6]
c : [1, 2, [3, 'b']]
d : [1, 2, [3, 4]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值