python的 = 默认是对对象进行引用,可以理解为是传递了指针

当不想让现有的修改影响原对象时就需要进行copy

常用的copy有shallow copy和deep copy两种

shallow copy会对对象的次一级元素进行引用

而deep copy会对对象的所有元素都进行复制

python中数值和字符存储地址固定,在地址查找到这一级时,相同的元素,地址一定是相同的

用列表 a = [1, 2, [3, 4]] 和字符串 e = ‘123’ 做例子

import copy

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

b = a

c = copy.copy(a)

d = copy.deepcopy(a)
print(id(a), id(b))
140285311739072 140285311739072

print(id(a[2]), id(b[2]))
140285311739328 140285311739328

print(id(a), id(c))
140285311739072 140285311740096

print(id(a[2]), id(c[2]))
140285311739328 140285311739328

print(id(a[2]), id(d[2]))
140285311739328 140285311739712

print(id(a[0]), id(d[0]))
140285390186800 140285390186800
e = '123'

f = '123'
print(id(e), id(f))
140285346185904 140285346185904

# 注意,字符串中的1和数字1地址不同
print(id(e[0]), id(a[0]))
140285389341936 140285390186800

字符串又可以看做是字符的数组,可以切片索引,不同之处是字符串和字符一样,地址固定不变

g = copy.deepcopy(e)

print(id(e), id(g))
140285346185904 140285346185904

python的copy函数在各大库中是通用的,但是各大库又有着自己的copy函数
以下为列举

numpy.copy()
shallow copy

DataFrame.copy(deep=True)
默认deep=True,deep copy

这里需要注意的是,当DataFrame中的元素是可遍历的对象如列表时,这个对象并不会被深拷贝,它只会引用这个对象的地址

在这里插入图片描述
这里的[4, 5]只能被浅拷贝,即使使用copy.deepcopy()也一样。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐