Python进阶(1)–浅拷贝与深拷贝

◎知识点

  1. 浅拷贝

  2. 深拷贝


◎脚本练习

#!/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

Python进阶(1)--浅拷贝与深拷贝

▽ 浅拷贝2

Python进阶(1)--浅拷贝与深拷贝


"""二、深拷贝"""

"""
    可以调用标准库模块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

Python进阶(1)--浅拷贝与深拷贝

▽ 深拷贝2

Python进阶(1)--浅拷贝与深拷贝


◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_advanced/copy_and_deepcopy.py

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/5023.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注