python易误点——赋值、深浅拷贝

  • 赋值
    举个例子
str='aaa'
str1=str
print(str is str1)
str='bbb'
print(str1)


---------------
output:
True
aaa

str=str1说明,str和str1指向同一个地址,那么为什么str改变了值之后,str1没有跟着变化呢?因为对于string这类的不可变对象,可变对象有list等,str=‘bbb’实现开辟一块地址给字符串‘bbb’然后将str指向这个地址。而str1还是指向之前存储‘aaa’的地址。这就导致了经过str=‘bbb’后,str和str1指向了不同的地址。

  • 拷贝

那么如何操作才能让元素值相等但是不是指向同一个地址呢?答案就是拷贝。

浅拷贝:shallow copy,只拷贝第一层的数据。python中赋值操作或copy模块的copy()就是浅拷贝
深拷贝:deep copy,递归拷贝所有层次的数据,python中copy模块的deepcopy()是深拷贝

浅拷贝

import copy
a=[1,2,3]
aa=[1,a,3]
aa1=copy.copy(aa)
aa1 is aa (False)
aa[1] is aa1[1] (True)

深拷贝

import copy
a=[1,2,3]
aa=[1,a,3]
aa1=copy.copy(aa)
aa1 is aa (False)
aa[1] is aa1[1] (False)

我们为要注意深拷贝和浅拷贝的区别呢:因为对于像列表这样的数据结构,如果是浅拷贝,修改了两个变量指向的同一个处理相同地址的可变元素(比如list),就可能会导致没能达到拷贝的效果。这里需要注意。
例如:

import copy
a=[1,2,3]
aa=[1,a,3]
aa1=copy.copy(aa)
aa[1]=[2,2,2,2]
print(aa[1])

output:
[2,2,2,2]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值