美文网首页
python学习笔记之--拷贝

python学习笔记之--拷贝

作者: itsenlin | 来源:发表于2021-12-04 01:35 被阅读0次

对象身份

在前面学习中可以知道python是面向对象的语言,所有类型变量都称为对象,而类型有一个身份属性,可以通过id()接口查看,其结果可以认为是对象的地址

>>> a = 10
>>> id(a)
7578432
>>>

浅拷贝

浅拷贝操作:创建一个类型与原对象一致,但内容是原对象元素的引用;所以浅拷贝对象的可变元素值变化时,原对象对应元素值也随之改变

  • 容器类型的完全切片操作[:]为浅拷贝
>>> a = [1, 2, [3, 4]]
>>> b = a[:]
>>> id(a), id(b)
(139930341384320, 139930341384768)
>>> a, b
([1, 2, [3, 4]], [1, 2, [3, 4]])
>>> b[2][0] = 5
>>> a, b
([1, 2, [5, 4]], [1, 2, [5, 4]])
>>>
  • 使用工厂函数list()dict()等为浅拷贝
>>> a = [1, 2, [3, 4]]
>>> b = list(a)
>>> id(a), id(b)
(139930341384576, 139930341384896)
>>> a, b
([1, 2, [3, 4]], [1, 2, [3, 4]])
>>> b[2][0] = 5
>>> a, b
([1, 2, [5, 4]], [1, 2, [5, 4]])
>>> 
  • copy模块的copy()函数为浅拷贝
>>> a = [1, 2, [3, 4]]
>>> import copy
>>> b = copy.copy(a)
>>> id(a), id(b)
(139930341384384, 139930341384448)
>>> a, b
([1, 2, [3, 4]], [1, 2, [3, 4]])
>>> b[2][0] = 5
>>> a, b
([1, 2, [5, 4]], [1, 2, [5, 4]])
>>>
  • 对于非容器类型对象,像Number、String以及其他原子类型对象(code、type、xrange对象等)都是引用赋值,而不涉及拷贝操作
>>> a = 10
>>> id(a)
7578432
>>> b = a
>>> id(b)
7578432
>>> 
  • 对于元组类型,如果元素类型都是原子类型,则拷贝动作只做浅拷贝动作
>>> a = (1, 2, 3)
>>> b = a[:]     
>>> id(a)
139930342902464
>>> id(b)
139930342902464
>>> import copy
>>> d = copy.copy(a)
>>> id(d)
139930342902464
>>> e = copy.deepcopy(a)
>>> id(e)
139930342902464
>>>

深拷贝

深拷贝会对原对象以及原对象元素都拷贝一份,这样对拷贝对象的修改对原对象无影响,坏处就是占空间

  • 深拷贝只能通过copy模块的deepcopy()函数实现
>>> a = [1, 2, [3, 4]]
>>> import copy
>>> b = copy.deepcopy(a)
>>> id(a), id(b)
(139930341351104, 139930341384896)
>>> a, b
([1, 2, [3, 4]], [1, 2, [3, 4]])
>>> b[2][0] = 5
>>> a, b
([1, 2, [3, 4]], [1, 2, [5, 4]])
>>> 

相关文章

网友评论

      本文标题:python学习笔记之--拷贝

      本文链接:https://www.haomeiwen.com/subject/gzcvxrtx.html