美文网首页
python 浅拷贝copy和深拷贝deepcopy

python 浅拷贝copy和深拷贝deepcopy

作者: stay丶gold | 来源:发表于2018-11-17 23:03 被阅读0次

python copy(浅拷贝)和deepcopy(深拷贝)

copy:只拷贝最外层数据,不拷贝里面的子层数据,即子层数据是共享的,不管修改源对象还是拷贝对象的子层数据,源数据和拷贝数据都会被修改
deepcopy:拷贝全部数据,包含所有子层

  • 浅拷贝copy
#coding:utf-8
list1 = [[1,2],3,4]
list2 = list1
print(list1)
print(list2)
#[[1, 2], 3, 4]
#[[1, 2], 3, 4]

list3拷贝list1,实际上是list3重新申请了一个内存地址,指向list1的值

list1 = [[1,2],3,4]
list3 = list1.copy()
print (list3)
#[[1, 2], 3, 4]

将源数据外层list1[1]修改为a,实际新开了一个内存存放变量a,而list1[1]指向a这个地址,不影响拷贝后的对象

list1 = [[1,2],3,4]
list4 = list1.copy()
list1[1] ='a'  #修改原list(不修改子list),不影响copy后list
print(list1)
print(list4)
#[[1, 2], 'a', 4]
#[[1, 2], 3, 4]

将拷贝数据外层list5[1]修改为b,实际新开了一个内存存放变量b,而list5[1]指向b这个地址,不影响源对象

list1 = [[1,2],3,4]
list5 = list1.copy()
list5[1] ='b' #修改copy后list(不修改子list),不影响原list
print(list1)
print(list5)
#[[1, 2], 3, 4]
#[[1, 2], 'b', 4]

将拷贝数据外层list6[0][0]修改为c,实际新开了一个内存存放变量c,而list6[0][0]指向c这个地址,这时候源数据list[0]也指向了这一块共享的区域,同样list[0][0]也发生了变化,指向了c,所以数据都会变化,如下


浅拷贝图解
list1 = [[1,2],3,4]
list6 = list1.copy()
list1[0][0] ='c' #修改原list的子list,影响copy后list
print(list1)
print(list6)
#[['c', 2], 3, 4]
#[['c', 2], 3, 4]
list1 = [[1,2],3,4]
list7 = list1.copy()
list7[0][0] ='c' #修改copy后list的子list,影响原list
print(list1)
print(list7)
#[['c', 2], 3, 4]
#[['c', 2], 3, 4]

删除源数据以后, 实际删除了list1对象,并不会删除数值,所以打印list1会报错,拷贝对象list7数据不变

list1 = [[1,2],3,4]
list7 = list1.copy()
del list1
#print(list1)
print(list7)
#[[1, 2], 3, 4]
  • 深拷贝deepcopy
    深拷贝从源对象完全克隆出数据,和源数据没有任何关联,所以修改数据只会影响自身
from copy import deepcopy
list1 = [[1,2],3,4]
list8 = deepcopy(list1)
print (list8)
#[[1, 2], '3', 4]
list1 = [[1,2],3,4]
list9 = deepcopy(list1)
list1[1] = 'a'
print (list1)
print (list9)
#[[1, 2], 'a', 4]
#[[1, 2], 3, 4]
list1 = [[1,2],3,4]
list10 = deepcopy(list1)
list10[1] = 'a'
print (list1)
print (list10)
#[[1, 2], 3, 4]
#[[1, 2], 'a', 4]
list1 = [[1,2],3,4]
list11 = deepcopy(list1)
list11[0][0] = 'a'
print (list1)
print (list11)
#[[1, 2], 3, 4]
#[['a', 2], 3, 4]
list1 = [[1,2],3,4]
list12 = deepcopy(list1)
list1[0][0] = 'a'
print (list1)
print (list12)
#[['a', 2], 3, 4]
#[[1, 2], 3, 4]

相关文章

  • day 9

    浅拷贝和深拷贝 copy.copy(对象):浅拷贝 copy.deepcopy(对象):深拷贝 copy.copy...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • 2018-10-10day9函数基础

    1.浅拷贝、深拷贝 copy.copy(对象):浅拷贝copy.deepcopy(对象):深拷贝""" """拷贝...

  • python 浅拷贝copy和深拷贝deepcopy

    python copy(浅拷贝)和deepcopy(深拷贝) copy:只拷贝最外层数据,不拷贝里面的子层数据,即...

  • day9-函数基础

    一、浅拷贝和深拷贝 import copycopy.copy(对象):浅拷贝copy.deepcopy(对象):深...

  • -119| python篇 |浅谈拷贝 copy()

    说到copy(), 很自然就要谈到深拷贝 deepcopy() 和 浅拷贝 copy() 深拷贝:拷贝值 和 重新...

  • Python浅拷贝与深拷贝

    Python浅拷贝与深拷贝 讨论import copy中copy.copy与copy.deepcopy区别。 根据...

  • 2018-10-10 Day9 函数基础

    01-浅拷贝和深拷贝 import copycopy.copy(对象):浅拷贝copy.deepcopy(对象):...

  • Python copy

    浅拷贝copy.copy() 深拷贝copy.deepcopy() List Slicing [:]和List转换...

  • Day9_基础函数

    一、浅拷贝深拷贝 import copycopy.copy(对象):浅拷贝copy.deepcopy(对象):深拷...

网友评论

      本文标题:python 浅拷贝copy和深拷贝deepcopy

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