一、可变类型与不可变类型
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]