◎知识点
浅拷贝
深拷贝
◎脚本练习
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @FileName: copy_and_deepcopy.py @Function: Python浅拷贝与深拷贝 @Author: Zhihe An @Site: https://chegva.com @Time: 2021/7/10 """ """一、浅拷贝""" """ 对于某个对象,如何创建它的拷贝呢?也就是说,如何创建与该对象具有相同值的另一个对象呢? 所谓浅拷贝,指的是:对于某个对象,虽然创建了与该对象具有相同值的另一个对象,但是,这两个对象 内部嵌套的对应子对象全都是同一个对象。简单地说,外部进行了拷贝,内部没有拷贝 以下方式得到的拷贝都是浅拷贝: (1) 切片操作[:] (2) 调用列表、字典、集合的方法copy() (3) 调用内置函数list()、dict()、set() (4) 调用标准库模块copy中的函数copy() """ L1 = [[3, 6], 8] # L2 = L1[:] # L2 = L1.copy() # L2 = list(L1) import copy # 导入标准库模块copy L2 = copy.copy(L1) # 调用标准库模块copy中的函数copy() print(L2) # [[3, 6], 8] print('id(L1):%s' % id(L1)) # id(L1):4386649728 print('id(L2):%s' % id(L2)) # id(L2):4386718208 print('id(L1[0]):%s' % id(L1[0])) # id(L1[0]):4386647808 print('id(L2[0]):%s' % id(L2[0])) # id(L2[0]):4386647808 print('id(L1[1]):%s' % id(L1[1])) # id(L1[1]):4384516624 print('id(L2[1]):%s' % id(L2[1])) # id(L2[1]):4384516624 L1[0][1] = 7 L1[1] = 9 print(L1) # [[3, 7], 9] print(L2) # [[3, 7], 8] """ 对于没有嵌套子对象的不可变对象,例如:整数对象、字符串对象和元组对象等,不会进行拷贝,也就是说, 不会创建另一个对象 """ i = 18 ic1 = int(i) print(ic1) # 18 print('id(i):%s' % id(i)) # id(i):4348980048 print('id(ic1):%s' % id(ic1)) # id(ic1):4348980048 ic2 = copy.copy(i) print(ic2) # 18 print('id(i):%s' % id(i)) # id(i):4348980048 print('id(ic2):%s' % id(ic2)) # id(ic2):4348980048 t = (1, 2, 3) tc1 = tuple(t) print(tc1) print('id(t):%s' % id(t)) # id(t):4440932544 print('id(tc1):%s' % id(tc1)) # id(tc1):4440932544
▽ 浅拷贝1
▽ 浅拷贝2
"""二、深拷贝""" """ 可以调用标准库模块copy中的函数deepcopy()实现深拷贝 所谓深拷贝,指的是:对于某个对象,创建与该对象具有相同值的另一个对象,同时,这两个对象 内部嵌套的对应可变子对象全都不是同一个对象。简单地说,外部和内部进行了拷贝 """ import copy L1 = [[3, 6], 8] L2 = copy.deepcopy(L1) # 调用标准库模块copy中的函数deepcopy() print(L2) # [[3, 6], 8] print('id(L1):%s' % id(L1)) # id(L1):4380346816 print('id(L2):%s' % id(L2)) # id(L2):4380350080 print('id(L1[0]):%s' % id(L1[0])) # id(L1[0]):4380347072 print('id(L2[0]):%s' % id(L2[0])) # id(L2[0]):4380349312 print('id(L1[1]):%s' % id(L1[1])) # id(L1[1]):4378212880 print('id(L2[1]):%s' % id(L2[1])) # id(L2[1]):4378212880 L1[0][1] = 7 L1[1] = 9 print(L1) # [[3, 7], 9] print(L2) # [[3, 6], 8] """ 对于没有嵌套子对象的不可变对象,例如:整数对象、字符串对象和元组对象等,不会进行拷贝,也就是说, 不会创建另一个对象 """ i = 18 ic = copy.deepcopy(i) print(ic) print('id(i):%s' % id(i)) # id(i):4470414160 print('id(ic):%s' % id(ic)) # id(ic):4470414160 t = (1, 2, 3) tc = copy.deepcopy(t) print(tc) print('id(t):%s' % id(t)) # id(t):4423896960 print('id(tc):%s' % id(tc)) # id(tc):4423896960 """ 如果不可变对象内部有嵌套的可变子对象,深拷贝之后,会创建一个与该不可变对象具有相同值的另一个对象 """ t1 = ([3, 6], 8) t2 = copy.deepcopy(t1) print(t2) # ([3, 6], 8) print('id(t1):%s' % id(t1)) # id(t1):4457890304 print('id(t2):%s' % id(t2)) # id(t2):4457844032 print('id(t1[0]):%s' % id(t1[0])) # id(t1[0]):4321873664 print('id(t2[0]):%s' % id(t2[0])) # id(t2[0]):4321874944 print('id(t1[1]):%s' % id(t1[1])) # id(t1[1]):4315888144 print('id(t2[1]):%s' % id(t2[1])) # id(t2[1]):4315888144
▽ 深拷贝1
▽ 深拷贝2