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中的元素是可遍历的对象如列表时,这个对象并不会被深拷贝,它只会引用这个对象的地址
如