Python中字典的复制方法copy()函数

快速学习方法:

(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

  • 17
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python字典是一种非常常用的数据类型。当我们需要复制一个字典时,可以使用字典copy()方法或者内置函数dict()来实现。这两种方法都可以复制一个字典,但是它们的实现方式略有不同。 使用字典copy()方法,可以创建一个新的字典,该字典包含原始字典所有的键值对。这个新字典是原始字典的一个副本,但是它们是两个不同的对象,修改其一个字典不会影响另一个字典。例如: ``` dict_01 = {"name": "张三", "age": 20} dict_02 = dict_01.copy() print("dict_02:", dict_02) print("dict_01:", dict_01) dict_02["name"] = "李四" print("dict_02:", dict_02) print("dict_01:", dict_01) print("dict_01的引用:", id(dict_01)) print("dict_02的引用:", id(dict_02)) ``` 输出: ``` dict_02: {'name': '张三', 'age': 20} dict_01: {'name': '张三', 'age': 20} dict_02: {'name': '李四', 'age': 20} dict_01: {'name': '张三', 'age': 20} dict_01的引用: 4310921664 dict_02的引用: 4310921728 ``` 使用内置函数dict(),可以创建一个新的字典,该字典包含原始字典所有的键值对。这个新字典也是原始字典的一个副本,但是它们是两个不同的对象,修改其一个字典不会影响另一个字典。例如: ``` dict_01 = {"name": "张三", "age": 20} dict_02 = dict(dict_01) print("dict_02:", dict_02) print("dict_01:", dict_01) dict_02["name"] = "李四" print("dict_02:", dict_02) print("dict_01:", dict_01) print("dict_01的引用:", id(dict_01)) print("dict_02的引用:", id(dict_02)) ``` 输出: ``` dict_02: {'name': '张三', 'age': 20} dict_01: {'name': '张三', 'age': 20} dict_02: {'name': '李四', 'age': 20} dict_01: {'name': '张三', 'age': 20} dict_01的引用: 4302451136 dict_02的引用: 4303857856 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘经纬老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值