12.Python深浅拷贝

一、引言

在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用

针对该列表l1=['a','b','c',['d','e','f']]一般有三种方法,分别为:拷贝(赋值)、浅拷贝、深拷贝

注意:拷贝/浅拷贝/深拷贝都是针对可变类型数据而言的

可变或不可变

  • ID不变值可变,即在原值的没基础上修改,则为可变数据类型
  • 值遍ID也变,即重新申请一个空间放入新的值,则为不可变数据类型
age = 19
print(f'first:{id(age)}')
age = 20
print(f'second:{id(age)}')

#first:270493056
#second:270493072

二、拷贝

如果L2是L1的拷贝对象,那么L1内部任何元素的变化,L2也会随之改变,因为可变类型值变id不变

l1 = ['1','2','3','4']
l2 = l1
l1.append('g')
print(l1)
print(l2)

#['1', '2', '3', '4', 'g']
#['1', '2', '3', '4', 'g']

三、浅拷贝

  • 如果L2是L1的浅拷贝对象,则L1内的里不可变元素发生了改变,L2 不变
  • L1内的可变元素发生了改变,则L2会跟着变
import  copy

l1 = ['1','2','3',['4','5']]
l2 =  copy.copy(l1)

l1.append('6')
print(l1)
print(l2)

#['1', '2', '3', ['4', '5'], '6']
#['1', '2', '3', ['4', '5']]

l1[3].append('7')
print(l1)
print(l2)

#['1', '2', '3', ['4', '5', '7'], '6']
#['1', '2', '3', ['4', '5', '7']]

四、深拷贝

如果l2是l1的深拷贝对象,那么:

  • l1内的不可变元素=发生了改变,l2不变

    l1内的可变元素发生了改变,l2也不变

    即:l2不会随l1改变而改变

import copy

l1 = ['1','2','3',['4','5']]
l2 = copy.deepcopy(l1)

l1.append('6')
print(l1)
print(l2)

#['1', '2', '3', ['4', '5'], '6']
#['1', '2', '3', ['4', '5']]

l1[3].append('7')
print(l1)
print(l2)

#['1', '2', '3', ['4', '5', '7'], '6']
#['1', '2', '3', ['4', '5']]
posted @ 2020-03-09 15:18  祥SHAO  阅读(77)  评论(0编辑  收藏  举报