码迷,mamicode.com
首页 > 编程语言 > 详细

Python的深浅拷贝

时间:2019-09-12 21:34:07      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:基础   注意   app   深浅拷贝   pytho   列表   pen   code   epc   

Python深浅拷贝

一丶引言

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

针对该列表

11 = ['a','b','c',['d','e','f']]

一般有三种方法,分别为:拷贝(赋值)、浅拷贝、深拷贝

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

1.1丶可变or不可变

id不变值可变,即在原值的基础上修改,则为可变数据类型;值变id也变,即重新申请一个空间放入新值,则为不可变数据类型。

age = 19
print(f'first:{id(age)}')
age = 20
print(f'second:{id(age)}')

first:257385936
second:257385952

二丶拷贝

如果l2是l1的拷贝对象,则l1内部的任何数据类型的元素变化,则l2内部的元素也会跟着改变,因为可变类型值变id不变。

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = l1
l1.append('g')
print(l1)
print(l2)

[‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘, ‘f‘], ‘g‘]
[‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘, ‘f‘], ‘g‘]

三丶浅拷贝

如果l2是l1的浅拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,则l2会跟着改变。

import copy
l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.copy(l1)

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

l1[3].append('h')

print(l1)
print(l2)
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
['a', 'b', 'c', ['d', 'e', 'f']]
['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
['a', 'b', 'c', ['d', 'e', 'f', 'g']]

[‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘, ‘f‘], ‘g‘]
[‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘, ‘f‘]]
[‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘, ‘f‘, ‘h‘], ‘g‘]
[‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘, ‘f‘, ‘h‘]]

四丶 深拷贝

如果l2是l1的深拷贝对象,则l1内的不可变元素发生了改变;如果l1内的可变元素发生了改变,l2也不会变,即l2永远不会因为l1的变化而变化。

import copy
l1 = ['a','b','c',['d','e','f']]
l2 = copy.deepcopy(l1)

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

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

[‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘, ‘f‘], ‘g‘]
[‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘, ‘f‘]]
[‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘, ‘f‘, ‘g‘], ‘g‘]
[‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘, ‘f‘]]

Python的深浅拷贝

标签:基础   注意   app   深浅拷贝   pytho   列表   pen   code   epc   

原文地址:https://www.cnblogs.com/shiqizz/p/11514870.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!