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


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

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]

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/281632.html

(0)
上一篇 2022年8月22日
下一篇 2022年8月22日

相关推荐

发表回复

登录后才能评论