欢迎来到田晓东的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
扩大
缩小

【拷贝问题】

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

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

正确结果为:

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']]

解析:

b=a 为引用,除非直接给a重新赋值,否则a变则b变
c=copy.copy(a) 浅拷贝,只会复制父对象,不会拷贝子对象;所以子对象变则c变,父对象变c不变
d=copy.deepcopy(a) 深拷贝,d与a不相关,a不论怎么变不影响d

!!!字典拷贝实例讲解

#!/usr/bin/python
# -*- coding: UTF-8 -*-
dict1 =  {'user':'runoob','num':[1,2,3]}
dict2 = dict1          # 浅拷贝: 引用对象
dict3 = dict1.copy()   # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用 
# 修改 data 数据
dict1['user']='root'
dict1['num'].remove(1) 
# 输出结果
print(dict1)
print(dict2)
print(dict3)

结果为:

{'num': [2, 3], 'user': 'root'}
{'num': [2, 3], 'user': 'root'}
{'num': [2, 3], 'user': 'runoob'}

练习2
字典值为整型数字,变更为另一整型数字

print('\n字典值为整型数字,变更为另一整型数字\n')
import copy
a={'1':1,'2':2}
b=copy.copy(a)
print("最开始,a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
a['1']=5
a['2']=6
print("字典a的值变为5和6后, a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
print('a,b两个字典第一个元素各为:',a['1'],b['1'])
print('a,b两个字典第一个元素和为:',a['1']+b['1'])
a['1']=1
a['2']=2
print("字典a的值变为1和2后, a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
print('a,b两个字典第一个元素各为:',a['1'],b['1'])
print('a,b两个字典第一个元素和为:',a['1']+b['1'])

结果分别为:

字典值为整型数字,变更为另一整型数字

最开始,a,a['1'],a['2'],b的内存地址为: 2434050752664 140711531151632 140711531151664 2434051261528
字典a的值变为5和6后, a,a['1'],a['2'],b的内存地址为: 2434050752664 140711531151760 140711531151792 2434051261528
a,b两个字典第一个元素各为: 5 1
a,b两个字典第一个元素和为: 6
字典a的值变为1和2后, a,a['1'],a['2'],b的内存地址为: 2434050752664 140711531151632 140711531151664 2434051261528
a,b两个字典第一个元素各为: 1 1
a,b两个字典第一个元素和为: 2

字典值为字符型,变更为另一整型数字

print('\n字典值为字符型,变更为另一整型数字\n')
import copy
a={'1':'a','2':'b'}
b=copy.copy(a)
print("最开始,a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
a['1']='c'
a['2']='d'
print("字典a的值变为'c'和'd'后,a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
print('a,b两个字典第一个元素各为:',a['1'],b['1'])
print('a,b两个字典第一个元素和为:',a['1']+b['1'])
a['1']=1
a['2']=2
print("字典a的值变为1和2后, a,a['1'],a['2'],b的内存地址为:",id(a),id(a['1']),id(a['2']),id(b))
print('a,b两个字典第一个元素各为:',a['1'],b['1'])

结果分别为:

字典值为字符型,变更为另一整型数字

最开始,a,a['1'],a['2'],b的内存地址为: 2434051314136 2434041375408 2434041359728 2434050752664
字典a的值变为'c'和'd'后, a,a['1'],a['2'],b的内存地址为: 2434051314136 2434012296112 2434012299760 2434050752664
a,b两个字典第一个元素各为: c a
a,b两个字典第一个元素和为: ca
字典a的值变为1和2后, a,a['1'],a['2'],b的内存地址为: 2434051314136 140711531151632 140711531151664 2434050752664
a,b两个字典第一个元素各为: 1 a

posted on 2021-09-08 10:29  匍匐的仰望者  阅读(40)  评论(0编辑  收藏  举报

导航