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

Python学习-列表深浅拷贝

时间:2018-07-10 23:40:46      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:png   str   分享   hal   ict   运行   图片   深浅拷贝   改变   

一、先看一个简单的赋值语句

lst1 = [France, Belgium, England]
lst2 = lst1
# lst1.append(‘Uruguay‘)
lst2.append(Uruguay)
print(lst1, lst2)
# 猜测一下lst1, lst2的结果;lst2变化是否对lst1产生影响,lst1变化是否对lst2产生影响

输出结果:

[France, Belgium, England, Uruguay] [France, Belgium, England, Uruguay]

不知道你是否猜对了?是否对输出结果感到疑惑?我们来看一下,在内存中变量与对象的对应关系,以及具体变化。

技术分享图片

(图画的不是很好, Pages工具用的不是很熟, 请见谅)

由上图可知,改变lst1或lst2,lst1和lst2同时发生变化。

 

二、列表的浅拷贝

浅拷贝(copy): 拷贝父对象, 不会拷贝对象的内部的子对象.

1、代码示例1

# 浅拷贝
movies = [药神, 邪不压正, [美国往事, 辛德勒的名单], 无问西东]
movies_c = movies.copy()

movies.append(解救吾先生)  # 直接改变movies列表
print(movies:, movies)
print(movies_c, movies_c)

# 运行结果
movies: [药神, 邪不压正, [美国往事, 辛德勒的名单], 无问西东, 解救吾先生]
movies_c [药神, 邪不压正, [美国往事, 辛德勒的名单], 无问西东]

2、代码示例2

# 浅拷贝
movies = [药神, 邪不压正, [美国往事, 辛德勒的名单], 无问西东]
movies_c = movies.copy()

movies[2].append(教父)  # 改变列表内部嵌套的列表
print(movies:, movies)
print(movies_c, movies_c)

# 运行结果
movies: [药神, 邪不压正, [美国往事, 辛德勒的名单, 教父], 无问西东]
movies_c [药神, 邪不压正, [美国往事, 辛德勒的名单, 教父], 无问西东]

结论:

  1) 由代码示例1和示例2的结果可以看出, 直接改变列表(一级元素增删改), 拷贝的列表不受影响;

  2) 当改变列表内部嵌套的列表的元素时, 拷贝的列表也受影响.

 

三、列表的深拷贝

深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

1、代码示例3

# 深拷贝
import copy
movies = [药神, 邪不压正, [美国往事, 辛德勒的名单], 无问西东]
movies_c = copy.deepcopy(movies)

movies.append(万箭穿心)
print(movies:, movies)
print(movies_c:, movies_c)

运行结果:
movies: [药神, 邪不压正, [美国往事, 辛德勒的名单], 无问西东, 万箭穿心]
movies_c: [药神, 邪不压正, [美国往事, 辛德勒的名单], 无问西东]

2、代码示例4

# 深拷贝
import copy
movies = [药神, 邪不压正, [美国往事, 辛德勒的名单], 无问西东]
movies_c = copy.deepcopy(movies)

movies[2].append(这个杀手不太冷)
print(movies:, movies)
print(movies_c:, movies_c)

运行结果:
movies: [药神, 邪不压正, [美国往事, 辛德勒的名单, 这个杀手不太冷], 无问西东]
movies_c: [药神, 邪不压正, [美国往事, 辛德勒的名单], 无问西东]

结论: 不管是直接改变列表(一级元素增删改), 还是改变列表内部嵌套的列表, 拷贝的列表不受影响.

 

深浅拷贝, 参考了菜鸟教程, 点击跳转. 拷贝前后, 变量与对象在内存中的对应关系, 可以参考教程中的图文解释.

Python学习-列表深浅拷贝

标签:png   str   分享   hal   ict   运行   图片   深浅拷贝   改变   

原文地址:https://www.cnblogs.com/gandoufu/p/9290205.html

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