python之拷贝

python之拷贝

复制、拷贝这是我们通常使用的一些功能,在python中拷贝的方式分为三种,赋值拷贝、浅拷贝与深拷贝。

赋值拷贝

首先我们先来看一下赋值拷贝:

a = 10
b = a

此种拷贝方式,我们称之为赋值拷贝,赋值拷贝有什么特点呢?

当我们查看它的id地址的时候,我们会发现,这两个变量的id是相同的。若是不可变类型的数据,我们进行更改的时候不会发现异常,但是如果是可变类型的变量就可能会出现问题:

list1 = [1,3,4,5]
list2 = list1
#若我们将list2中数据中的5更改为“hello”
list2[-1] = "hello"
#此时我们打印list1,我们会发现list1的最后一个元素也更改成了hello

为什么会出现这样的情况呢?

这是因为在python中存储的时候,变量名与数据是分开存储的,那么当我们进行赋值拷贝的时候,只是我们增加了一个变量名指向了同一块地址,那么当这个数据地址的内容进行更改的时候,两个变量名的内容会同时更改。那么如果我们不想这两个变量相互影响,那么我们该怎么办呢?

浅拷贝

浅拷贝主要用于可变类型的数据。

list1 = [1,2,3,4,5]
list2 = list1.copy()

当我们使用浅拷贝的时候,就不会出现像赋值拷贝的情况,如果我们做同样的操作,把list2的最后一个元素该为“hello“的时候,我们会发现只有list2发生了变化,而list1还是原来的数据。

但是,大家知道在list中不单单可以存放number类型的,还能存放list,dict等可变类型的数据,那么,我们尝试一下,若使用copy方法对二维列表进行拷贝。

list1 = [[1,2,3],[4,5,6]]
list2 = list1.copy()

当我们把list2中的6更改为hello的时候

list2[-1][-1] = "hello"

我们打印list1的时候,居然发现list1也被更改了,这是什么鬼?

难道copy不起作用了吗?为什么会出现这样的情况呢?

在这里大家注意一下,当我们列表中存放列表的时候,其实存放的只是对于子列表的一个引用而已【地址】,也就是说,对于多维的列表,如果我们只是使用copy,而我们更改它的子列表的时候,它的子列表会同时发生变化。也就是说,使用copy并不能解决多维列表的拷贝相互影响的问题,那么这个问题要如何解决呢?

深拷贝

为了解决这个问题,python给我们提供了一个copy模块,我们可以使用模块中的深拷贝的方法的来进行拷贝。

list1 = [[1,2,3,4],[2,3,4]]
list2 = copy.deepcopy(list1)

我们再来尝试更改list2中的4为hello

list2[-1][-1] = "hello"

我们再来打印list1,惊喜的发现,list1是没有变化的,问题已经解决!

总结

因此赋值拷贝仅仅为地址拷贝,copy为一维列表的内存拷贝,而深拷贝才算的上是真正的内存拷贝!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值