python浅拷贝与深拷贝例题

下面代码运行后,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')

A  a ==  [1,2, 3, 4, ['a', 'b', 'c'], 5]
B  b ==  [1,2, 3, 4, ['a', 'b', 'c'], 5] 
C  c ==  [1,2, 3, 4, ['a', 'b', 'c']]
D  d ==  [1,2, 3, 4, ['a', 'b', 'c']]

————————————————— 思考分割线————————————————————

答案:D

为了更清楚的说明,我将用图来说明,首先我们看看a这个list在电脑里实际的存储情况

python浅拷贝与深拷贝例题_第1张图片

 

首先我们看看看b的情况,b实际上和a指向的是同一个值,就好比人的大名和小名,只是叫法不同,但还是同一个人

python浅拷贝与深拷贝例题_第2张图片

 

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

python浅拷贝与深拷贝例题_第3张图片

 

若父对象发生变化,c不会变化,因为它已经复制的所有父对象,假如子对象发生变化则c会变,比如c[4]和a[4]实际都是一个变量list,他们都指向子对象,若子对象发生变化,他们必然都变化,比如变成["a","d"],那它们指向的值也就变成了a、d。

再看看d的情况,这就是我们所说的深复制,不管a进行什么操作,都不会改变d了,他们已经指向不同的值(这里是指在内存中存储的位置不同了)。

python浅拷贝与深拷贝例题_第4张图片 

 

总结:

b=a,只是换了一个名字,a怎么变b就怎么变,

c是浅复制,只复制了a的部分值,仍然共用某些值,所以在对a的子对象进行操作时会改变c

d是深复制,完全复制了a的所有值,已经完全与a无关,对a的任何操作都不会影响d

 

你可能感兴趣的:(python每日一题,python)