python numpy 深拷贝 浅拷贝总结

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方法的父对象是深拷贝,子对象是浅拷贝

总结: 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。 深拷贝 拷贝对象及其子对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值