ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python中可变类型与不可变类型、浅拷贝与深拷贝

2022-08-22 15:04:37  阅读:199  来源: 互联网

标签:变量 Python print 地址 类型 拷贝 id


一、可变类型与不可变类型

1.可变类型:列表、字典、集合

2.不可变类型:字符串、整数、元组

#可变类型赋值给一个新变量时,新变量所指id是不变的,当原变量发生变化时,因为所指id一样所以新变量也会发生变化,新旧相互影响

#不可变类型赋值给一个新变量,新变量所指的id在原变量不发生改变时,所指id不变,一旦新变量内容发生变化就会指向一个新id,新旧之间不影响

二、浅拷贝与深拷贝

1.浅拷贝:浅拷贝变量中,既有可变类型,又有不可变类型,拷贝的是地址

 1 import copy
 2  
 3 a = ['hello', [1, 2, 3]]
 4 b = copy.copy(a)
 5 print('原容器:', a, '地址:', [id(i) for i in a])
 6 print('浅拷贝:', b, '地址:', [id(j) for j in b])
 7 print('------------------------------------')
 8 
 9 a[0] = 'world'
10 print(a)
11 print('原容器:', a, '地址:', [id(i) for i in a])
12 print('浅拷贝:', b, '地址:', [id(j) for j in b])#浅拷贝是在另一块地址上创建一个新的变量,但是变量内的元素是源对象的元素的地址的拷贝
13                                                 #拷贝的是地址
14 print('------------------------------------')
15 
16 a[1].append(4)
17 print('原容器:', a, '地址:', [id(i) for i in a])
18 print('浅拷贝:', b, '地址:', [id(j) for j in b])
19 
20 #浅拷贝时,拷贝变量内有不可变类型,当不可变类型被替换时,拷贝的还是指的旧id
21 #但是被拷贝对象的不可变类型id已经变化
22 #拷贝变量内有可变类型,其发生改变时id是不会变的,所以会相互影响

2.深拷贝:在新的地址上新建一个拷贝副本,只拷贝值,不拷贝地址

 1 import copy
 2  
 3 a = ['hello', [1, 2, 3]]
 4 c = copy.deepcopy(a)
 5 print('原容器:', a, '地址:', [id(i) for i in a])
 6 print('深拷贝:', c, '地址:', [id(j) for j in c])
 7 a[0] = 'world'
 8 a[1].append(4)
 9 print('原容器修改后:', a, '地址:', [id(i) for i in a])
10 print('原容器修改后深拷贝:', c, '地址:', [id(j) for j in c])
11 
12 #结果
13 
14 #原容器: ['hello', [1, 2, 3]] 地址: [2165485837360, 2165485804224]
15 #深拷贝: ['hello', [1, 2, 3]] 地址: [2165485837360, 2165485667712]
16 #原容器修改后: ['world', [1, 2, 3, 4]] 地址: [2165485837552, 2165485804224]
17 #原容器修改后深拷贝: ['hello', [1, 2, 3]] 地址: [2165485837360, 2165485667712]

 

标签:变量,Python,print,地址,类型,拷贝,id
来源: https://www.cnblogs.com/jihexiansheng/p/16612773.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有