python直接赋值、深浅拷贝实例剖析

根据数据类型分为两部分进行剖析:

  • int、str类型     
  • list、tuple、dict类型等

1.  int、str类型

【int类型实例】
>>> import copy                        # 导入copy模块
>>> a1=11
>>> a2=a1                              # 直接赋值引用
>>> a3=copy.copy(a1)                   # 浅拷贝
>>> a4=copy.deepcopy(a1)               # 深拷贝
>>> id(a1),id(a2),id(a3),id(a4)
>>> (1357559168, 1357559168,1357559168,1357559168)                            


【str类型实例】
>>> import copy                         # 导入copy模块
>>> b1='css'
>>> b2=b1                               # 直接赋值引用
>>> b3=copy.copy(b1)                    # 浅拷贝
>>> b4=copy.deepcopy(b1)                # 深拷贝
>>> id(b1), id(b2),id(b3),id(b4)
>>> (43826624,43826624,43826624,43826624)

由以上实例可得出:int和str类型,无论是直接赋值引用 or 深浅拷贝,均指向同一块内存空间,因此对于int和str类型的变量而言,三种方法作用相同

2. list、tuple、dict等类型(以list类型为例

【示例】
>>> import copy                          # 导入copy模块
>>> L1=[11,22,33,['a','b','c']]      # 定义list变量,其中L1[3]的值是一个子列表
>>> L2=L1                                 # 直接赋值引用
>>> L3=copy.copy(L1)                # 浅拷贝
>>> L4=copy.deepcopy(L1)         # 深拷贝
>>> id(L1),id(L2),id(L3),id(L4)
>>> (43777928,43777928,43776968,43795912)
>>> L1.append(44)                    # L1列表父对象添加元素
>>> L1[3].append('d')                # L1列表子对象添加元素
>>> L1
>>> [11,22,33,['a','b','c','d'],44]
>>> L2
>>> [11,22,33,['a','b','c','d'],44]
>>> L3
>>> [11,22,33,['a','b','c','d']]
>>> L4
>>> [11,22,33,['a','b','c']]

以上示例说明:

1. 直接赋值即是对象的引用,指向同一内存地址

2. 浅拷贝:只拷贝一层,如上述示例,只拷贝父对象,不拷贝父对象内部的子对象(L3[3]仍指向原L1子对象的内存地址),故分别在L1父对象和子对象中添加元素44和'd', 对L3父对象无影响,只对其子对象有影响

3. 深拷贝:拷贝父对象及子对象

posted on 2018-01-23 23:33  柠檬加醋  阅读(278)  评论(0编辑  收藏  举报

导航