Python学习-列表深浅拷贝
Posted 糖醋干豆腐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习-列表深浅拷贝相关的知识,希望对你有一定的参考价值。
一、先看一个简单的赋值语句
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学习-列表深浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章
# yyds干货盘点 # Python列表中的深浅拷贝,你学废了嘛?