python中的引用、浅copy、深copy

下面代码运行后,a、b、c、d四个变量的值,描述错误的是?

import copy
a = [1, 2, 3, 4, ['a', 'b']] 
b = a 
c = copy.copy(a) 
d = copy.deepcopy(a) 
a.append(5) 
a[4].append('c') 

正确答案: D 你的答案: D (正确)
a == [1,2, 3, 4, [‘a’, ‘b’, ‘c’], 5]
b == [1,2, 3, 4, [‘a’, ‘b’, ‘c’], 5]
c == [1,2, 3, 4, [‘a’, ‘b’, ‘c’]]
d == [1,2, 3, 4, [‘a’, ‘b’, ‘c’]]

解析
      import copy
      a = [1, 2, 3, 4, [‘a’, ‘b’]]
      b = a # 引用,除非直接给a重新赋值,否则a变则b变,b变则a变
      c = copy.copy(a) # 浅复制,只会拷贝父对象, 不会拷贝父对象中的子对象,所以若a的子对象变则c 变,但是父对象变c不会变
      d = copy.deepcopy(a) #深拷贝,完全拷贝,完全独立于原对象,a变也不变
      a.append(5) # 改变父对象
      a[4].append(‘c’) #改变父对象中的 [‘a’, ‘b’]子对象

#a=[1, 2, 3, 4, [‘a’, ‘b’,‘c’],5]
b=[1, 2, 3, 4, [‘a’, ‘b’,‘c’],5]
c=[1, 2, 3, 4, [‘a’, ‘b’,‘c’]]
d=[1, 2, 3, 4, [‘a’, ‘b’]]

为了更清楚的说明,我将用图来说明,首先我们看看a这个list在电脑里实际的存储情况
在这里插入图片描述
首先我们看看看b的情况,b实际上和a指向的是同一个值,就好比人的大名和小名,只是叫法不同,但还是同一个人

在这里插入图片描述
      接下来再看看c的情况,c的情况和a.copy()的情况是一样的,都是我们所谓的浅拷贝(浅复制),浅拷贝只会拷贝父对象,不会拷贝子对象,通俗的说就是只会拷贝到第二层
在这里插入图片描述

      若父对象发生变化,c不会变化,因为它已经复制的所有父对象,假如子对象发生变化则c会变,比如c[4]和a[4]实际都是一个变量list,他们都指向子对象,若子对象发生变化,他们必然都变化,比如变成[“a”,“d”],那它们指向的值也就变成了a、d。
      再看看d的情况,这就是我们所说的深复制,不管a进行什么操作,都不会改变d了,他们已经指向不同的值(这里是指在内存中存储的位置不同了)。
在这里插入图片描述

总结:

b=a,只是换了一个名字,a怎么变b就怎么变
c是浅复制,只复制了a的部分值,仍然共用某些值,所以在对a的子对象进行操作时会改变c
d是深复制,完全复制了a的所有值,已经完全与a无关,对a的任何操作都不会影响d

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值