2022年 11月 3日

python 拷贝

文章目录

    • 说明
    • 案例

说明

  • 直接赋值:

    • python直接赋值其实就是对象的引用(别名)。
    • 即:对象的赋值都是进行对象引用(内存地址)传递
    • 二者指向同一对象
  • 浅拷贝:

    • 拷贝父对象,不会拷贝对象内部的子对象。
    • 即:浅拷贝会创建一个新的对象,但是,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)
    • 产生浅拷贝的效果:
      • 使用切片[:]操作
      • 使用工厂函数(如list/dir/set)
      • 使用copy模块中的copy()函数
    • 二者是一个独立的对象,但他们的子对象还是指向统一对象(是引用)
  • 深拷贝:

    • copy的deepcopy方法,完全拷贝了父对象及子对象。
    • 二者是完全独立的对象
  • 拷贝的特殊情况:

    • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有拷贝这一说。
    • 如果元祖变量只包含原子类型对象,则不能深拷贝。

案例

代码:

#!/usr/bin/python
# -*-coding:utf-8 -*-
 
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
b = a                       #赋值,传对象的引用
c = copy.copy(a)            #对象拷贝,浅拷贝
d = copy.deepcopy(a)        #对象拷贝,深拷贝

a.append(5)                 #修改对象a
a[4].append('c')            #修改对象a中的['a', 'b']数组对象
 
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

输出:


('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5]) # 原始
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5]) # 赋值,引用一样
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']]) #浅拷贝,只子对象一样
('d = ', [1, 2, 3, 4, ['a', 'b']]) # 深拷贝,二者完全独立
  • 1
  • 2
  • 3
  • 4
  • 5