1. 浅拷贝
1.1 重新分配一块内存空间,里面新的元素指向原来元素的位置(类似软件的快捷方式)
str1 = '张三' #不可变数据类型
print(str1, id(str1)) # 张三 1758431924592
str2 = copy(str1)
print(str2, id(str2)) # 张三 1758431924592 >>>浅拷贝不会新建内容地址,使用的是原数据的内存地址
1.2 从copy方法源码得知list,set,dict并没有使用python封装的方法,进行浅拷贝是也会改变地址,只有使用python自身封装的copy方法才是python所定义的浅拷贝
list1 = ['张三']
list2 = copy(list1)
print(list1, id(list1)) # ['张三'] 2336295101952
print(list2,id(list2)) # ['张三'] 2336295101952
1.3 浅拷贝针对的为不可变数据类型,若拷贝的可变数据数据类型是多层级的情况,内层数据发生变化,则拷贝后的数据也会随之变化
1.4 浅拷贝若拷贝的是单层级的数据,则数据不受影响
list1 = ['张三']
listno = [] #新建一个list用于存放数据
print(list1, id(list1)) # ['张三'] 2336295101952
print(listno,id(list1)) # [] 2336295101952
list2 = copy(listno)
print(list2,id(list2)) # [] 2336292948608 >>>list进行copy的时候从copy方法源码得知list,set,dict并没有使用python封装的方法,python自身封装的copy方法才是浅拷贝
listno.extend([list1]) # 将list1作为整体添加到listno中,成为lidtno的内层数据
list_copy = copy(listno) # 将listno拷贝给lidt_copy
list3 = copy(list1) # 将list1拷贝给list3
list1.extend(['李四'])
print(list1, id(list1)) # ['张三', '李四'] 2336295101952
print(list_copy,id(list_copy)) # [['张三', '李四']] 2336292948608 >>>拷贝的可变数据数据类型是多层级的情况,内层数据发生变化,则拷贝后的数据也会随之变化
print(list3,id(list3)) # ['张三'] 2585952920128 >>>拷贝的是单层级的数据,则数据不受影响
2.深拷贝
2.1 重新分配一块内存空间,里面的新元素独立跟原来的数据是没有任何关联(独立的软件)
str1 = '张三'
print(str1, id(str1)) # 张三 2599287968112
str2 = deepcopy(str1)
print(str2, id(str2)) # 张三 2599287968112 >>>深拷贝会新建内存地址,拷贝后的数据使用新地址
2.2 深拷贝只会拷贝在拷贝动作时的数据,若拷贝后数据发生变化也不会受影响
list1 = ['张三']
listno = [] #新建一个list用于存放数据
print(list1, id(list1)) # ['张三'] 2336295101952
print(listno,id(list1)) # [] 2336295101952
list2 = deepcopy(listno)
print(list2,id(list2)) # [] 2336292948608
listno.extend([list1]) # 将list1作为整体添加到listno中,成为lidtno的内层数据
list_copy = deepcopy(listno) # 将listno拷贝给lidt_copy
list3 = deepcopy(list1) # 将list1拷贝给list3
list1.extend(['李四'])
print(list1, id(list1)) # ['张三', '李四'] 2336295101952
print(list_copy,id(list_copy)) # [['张三']] 2336292948608 >>>深拷贝只会拷贝当前的数据,若数据发生变化也不会受影响
print(list3,id(list3)) # ['张三'] 2585952920128