快速学习方法:
(1)请先看图1和图2
(2)然后看问题解析
(3)最后看题
选择题
以下选项中输出的c哪一项是正确的?
import copy
a = {'A':1,'B':['a','b']}
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a['A']=0
a['C']=5
a['B'].append('c')
# print( 'a=', a )
# print( 'b=', b )
print( 'c=', c )
# print( 'd=', d )
A c={'A': 1, 'B': ['a', 'b', 'c'], 'C': 5}
B c={'A': 0, 'B': ['a', 'b', 'c'], 'C': 5}
C c={'A': 1, 'B': ['a', 'b', 'c']}
D c={'A': 1, 'B': ['a', 'b']}
问题解析
1.引用复制(先看图1和图2)
1.1.引用复制的含义:把(一个对象的)引用复制给另一个引用,内存中并没有创建另一个对象,而只是拷贝了这个对象的引用而已。
1.2.引用复制的本质:两个引用指向同一个对象,即两个引用(C语言里叫做指针)指向的地址完全一样的。修改其中一个对象,另一个对象也会跟着改变。(逻辑图见评论区图1)
1.3.引用复制的例子:见评论区图2。如例子中所示,已知存在一个变量a,当进行引用复制时,b和a指向同一内存地址,由此当a进行变化时,b也会随之发生变化。
2.浅拷贝(先看图1和图2的copy)
2.1.浅拷贝的含义:复制原数据中浅层(第一层)的对象到新的内存空间,深层对象不复制(共享)。
2.2.浅拷贝的本质:对浅层对象的拷贝是拷贝浅层对象的内容,并写入到新的内存中;对深层对象的拷贝是对深层对象进行引用复制,深层对象的内存地址保持一致。python中使用copy()函数需要引用copy库。
2.3.浅拷贝的例子见评论区图2:已知存在一个变量a,当进行浅拷贝时,c对a中的浅层对象进行拷贝,并记录到新的的内存中,而针对深层对象['a', 'b'],则进行引用复制。因此对a进行浅层内容的修改时,c中的值不发生改变,即a和c的浅层对象是独立空间,a浅层增加了5,c浅层不受影响;对a中的深层对象['a', 'b']进行修改时,由于a和c的深层对象指向同一内存地址,因此c中的深层对象会发生改变。
3.深拷贝(先看图1和图2的deepcopy)
3.1.深拷贝的含义:对浅层和深层对象都进行复制的值并开辟了新的内存地址,新对象与原始对象是完全独立,包括浅层对象和深层对象,原对象的值的改变不会引起新对象的值的改变。python中使用deepcopy()函数需要引用copy库。(逻辑图见评论区图1)
3.2. 深度拷贝的例子见评论区图2:已知存在一个变量a,当进行深拷贝时,d对a中的浅层对象及深层对象进行拷贝,并记录到新的的内存中。因此对a进行浅层内容的修改时,d中的值不发生改变;对a中的深层对象['a', 'b']进行修改时,d中的深层对象也不会发生改变。
4. 题目解析:
4.1. 题目中首先定义了字典a = {'A':1,'B':['a','b']},b是对a的引用复制,c是对a的浅拷贝,d是对a的深拷贝。
4.2. 修改a中的数据,针对浅层对象:将A的数据修改为0,增加C的数据为5,针对深层对象:向'B':['a','b']中增加新的对象c。
4.3. c是a的浅拷贝,因此c拷贝a的浅层对象,深层对象不拷贝,深层对象是复制引用,对a的浅层对象进行修改时c不受影响,而针对a的深层对象进行修改时,c中的深层对象会受到影响,因此输出的c为c= {'A': 1, 'B': ['a', 'b', 'c']}
图1 引用、浅拷贝、深拷贝原理对比
图2 列表的例子说明引用、浅拷贝、深拷贝原理对比
图3 正确答案是C
温馨期待
期待大家提出宝贵建议,互相交流,收获更大,助教:mmy
欢迎大家转发,一起传播知识和正能量,帮助到更多人。期待大家提出宝贵改进建议,互相交流,收获更大。辛苦大家转发时注明出处(也是咱们公益编程交流群的入口网址),刘经纬老师共享知识相关文件下载地址为:http://liujingwei.cn