python numpy 深拷贝 浅拷贝总结
#浅拷贝
import numpy as np
a = np.arange(4)
b=a
print('a:',a)
print('b:',b)
b[0]=1
print('切片改变b的第1个位置上的元素之后———')
print('a:',a)
print('b:',b)
a: [0 1 2 3]
b: [0 1 2 3]
切片改变b的第1个位置上的元素之后———
a: [1 1 2 3]
b: [1 1 2 3]
像这样改变了b后 a的值也跟着改变 这种将内存引用赋值给另一个变量的操作叫做浅拷贝
而在赋值的时候,不把同一个内存对象的引用赋值给另一个变量,令两个变量所指向的对象不一样,更改值的时候不相互影响,这种操作就是深拷贝
#切片方法和.copy()方法在没有其他对象情况下
print('1.切片方法')
a = np.arange(4)
b = a[:]
print('a:',a)
print('b:',b)
b[0] = 1
print('切片改变b的第1个位置上的元素之后———')
print('a:',a)
print('b:',b)
print('\n')
print('2.copy()方法')
a = np.arange(4)
b = a.copy()
print('a:',a)
print('b:',b)
b[0] = 1
print('.copy()改变b的第1个位置上的元素之后———')
print('a:',a)
print('b:',b)
1.切片方法在没有其他对象情况下,和深拷贝一样
a: [0 1 2 3]
b: [0 1 2 3]
切片改变b的第1个位置上的元素之后———
a: [1 1 2 3]
b: [1 1 2 3]
2.copy()在没有其他对象时,和深拷贝一样
a: [0 1 2 3]
b: [0 1 2 3]
.copy()改变b的第1个位置上的元素之后———
a: [0 1 2 3]
b: [1 1 2 3]
可以看到在没有其他对象情况下
切片方法是浅拷贝
.copy()方法是深拷贝
#有子对象的切片方法和.copy()方法
print('1.有子对象的切片操作')
a = np.array([0, 1, [2,3], [4,5]])
b = a[:]
print('a:',a)
print('b:',b)
b[2][0] =99
b[1] = 2
print('切片改变b的[2][0]位置和[1]位置上的元素之后———')
print('a:',a)
print('b:',b)
print('\n')
print('2.有子对象的.copy()操作')
c = np.array([0, 1, [2,3], [4,5]])
d = c.copy()
print('c:',c)
print('d:',d)
d[2][0] = 999
d[1] = 2
print('.copy()改变d的[2][0]位置和[1]位置上的元素之后———')
print('c:',c)
print('d:',d)
1.有子对象的切片操作
a: [0 1 list([2, 3]) list([4, 5])]
b: [0 1 list([2, 3]) list([4, 5])]
切片改变b的[2][0]位置和[1]位置上的元素之后———
a: [0 2 list([99, 3]) list([4, 5])]
b: [0 2 list([99, 3]) list([4, 5])]
2.有子对象的.copy()操作
c: [0 1 list([2, 3]) list([4, 5])]
d: [0 1 list([2, 3]) list([4, 5])]
.copy()改变d的[2][0]位置和[1]位置上的元素之后———
c: [0 1 list([999, 3]) list([4, 5])]
d: [0 2 list([999, 3]) list([4, 5])]
有子对象时
切片方法的父对象和子对象都是浅拷贝
.copy方法的父对象是深拷贝,子对象是浅拷贝
总结: 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。 深拷贝 拷贝对象及其子对象