python中的赋值与拷贝详解

python中的赋值与拷贝有什么区别呢?我们今天来仔细的分析一下。我们常用”=“操作符实现赋值操作。python中的拷贝可以通过copy这个module来实现。在讲赋值和拷贝之前,我们先来讲一下python对象在内存中的存储。在python中,变量存储的并不是变量自身的值,而是变量自身值所在的地址。如下图所示。
在这里插入图片描述

赋值
list_a = [1,2,3,4]
list_b = list_a
list_a.append(5)
print(list_a)
print(list_b)

输出结果如下所示

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

我们可以看到,我们只修改了list_a,但是list_b的值也跟着变了,这是因为在赋值的过程中,只产生了一个变量list_b,但是该变量的地址与list_a中的地址相同,即指向同一个对象。

浅拷贝

我们可以通过python中的copy.copy()函数实现浅拷贝。举例如下

import copy
list_a = [[1,2],1,2,3,4]
list_b = copy.copy(list_a)
list_a[0].append(3)
list_a.append(5)
print(list_a)
print(list_b)

输出结果

[[1, 2, 3], 1, 2, 3, 4, 5]
[[1, 2, 3], 1, 2, 3, 4]

通过这个例子我们发现,当执行完浅拷贝后,再对list_a进行修改,对list_a新增元素5,并不会改变list_b对象,但是当我们对list_a中的元素进行修改时,即对list_a中的子元素列表增加新元素时,list_b也发生了改变。这是因为浅拷贝与赋值不同,浅拷贝创建了一个新的对象,变量list_b中的地址指向这个新的对象,这个新对象里面是对list_a中子元素的引用,即只拷贝了一层,因此,被称为浅拷贝。赋值是对对象的引用,而浅拷贝则是对对象内子元素的引用。

深拷贝

由于浅拷贝得到的变量,其中的值可能会随原对象的变化而变化,有时会带来不必要的麻烦,因此,我们又用到了深拷贝,深拷贝可用copy.deepcopy()函数实现。例子如下

import copy
list_a = [[1,2],1,2,3,4]
list_b = copy.deepcopy(list_a)
list_a[0].append(3)
list_a.append(5)
print(list_a)
print(list_b)

输出结果

[[1, 2, 3], 1, 2, 3, 4, 5]
[[1, 2], 1, 2, 3, 4]

深拷贝的变量不再受原对象变化的影响。因为深拷贝生成的新对象不再引用,而是直接将原对象内的元素递归的复制到自己的存储空间内,因此称之为深拷贝。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值