可变对象与不可变对象,深拷贝与浅拷贝

可变对象与不可变对象

每个对象都有身份(id)、类型、值;
根据对象的值是否可以修改分为可变对象与不可变对象;
可变对象包括:list,dict,set
不可对象包括:tuple,string ,int ,float ,bool

1.可变对象

>>>a=[1,2,3]
>>>id(a)
1449144587336
>>>b=a
>>>id(b)
1449144587336
>>>a[0]=2
>>>a
[2, 2, 3]
>>>id(a)
1449144587336
>>>b
[2, 2, 3]
>>>id(b)
1449144587336

可以看出,修改a后,b的值和地址还是与a一样

2.不可变对象

>>>a=(1,2,3)
>>>id(a)
1449144622464
>>>b=a
>>>id(b)
1449144622464
>>>a[0]=2
TypeError                                 Traceback (most recent call last)
<ipython-input-10-390f2e90dcac> in <module>()
----> 1 a[0]=2

TypeError: 'tuple' object does not support item assignment
>>>a=(2,2,3)
>>>id(a)
1449145158032
>>>b
(1, 2, 3)
>>>id(b)
1449144622464

可以看出,元组为不可变对象,不可变对象不能进行修改;当a改变后,a的值与地址都发生变化,但b的值与地址都不变

深拷贝与浅拷贝

浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象。
深拷贝: copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

1.浅拷贝

想要内部的元素是一样的,对其中一个进行修改,另一个也会跟着变,就像再往数据上贴标签,使用浅拷贝;
共享内存地址的两个变量,当其中一个变量的值改变时,另一个变量叶随之改变。此时,变量间的“拷贝”是"浅拷贝"

>>>import numpy as np
>>>a=np.array([-45,-66,2,25,99,-33])
>>>b=a
>>>b is a
True
>>>id(a)
2150984309776
>>>id(b)
2150984309776
>>>a==b
array([True,True,True,True,True,True])
>>>a[0]=6
>>>a
array([6,-66,2,25,99,-33])
>>>b
array([6,-66,2,25,99,-33])
>>>c=np.array([-45,-66,2,25,99,-33])
>>>d=np.array([-45,-66,2,25,99,-33])
>>>id(c)
2596605689984
>>>id(d)
2596605690944
>>>c is d
Flase
>>>c==d
array([ True,  True,  True,  True,  True,  True])
>>>c[1]=666
>>>c
array([-45, 666,   2,  25,  99, -33])
>>>d
array([-45, -66,   2,  25,  99, -33])

视图(view)

>>>e=np.array([-45,-66,2,25,99,-33])
>>>f=e.view()#f与e“共享视图”
>>>id(e)
2596605818320
>>>id(f)
2596605820240
>>>f.shape=(2,3)
>>>f
array([[-45, -66,   2],
       [ 25,  99, -33]])
>>>e[0]=0
>>>e
array([  0, -66,   2,  25,  99, -33])
>>>f
array([[  0, -66,   2],
       [ 25,  99, -33]])
>>>f[1,1]=88
>>>f
array([[  0, -66,   2],
       [ 25,  88, -33]])
>>>e
array([  0, -66,   2,  25,  88, -33])

共享“视图”(view)的两个变量,当其中一个变量的值发生改变时,另一个变量的值也随之改变,所以,变量间的“拷贝”也是"浅拷贝"

2.深拷贝

想要得到一个对于某个元素的重新赋值不会影响原对象,但是内部的元素全都是一样的对象,使用深拷贝;
通过“深拷贝”得到的变量互不干扰,完全独立,其中一个变量的值改变时,不影响其他变量的值。

>>>e
array([  0, -66,   2,  25,  88, -33])
>>>g=np.copy(e)#g是e的深拷贝
>>>g
array([  0, -66,   2,  25,  88, -33])
>>>e[0]=8
>>>e
array([  8, -66,   2,  25,  88, -33])
>>>g
array([  0, -66,   2,  25,  88, -33])
>>>id(e)
2596605818320
>>>id(g)
2596605818330
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值