51学通信论坛2017新版
标题:
1.11 列表的copy方法(深拷贝和浅拷贝)
[打印本页]
作者:
爱卫生
时间:
2017-12-12 22:38
标题:
1.11 列表的copy方法(深拷贝和浅拷贝)
本帖最后由 爱卫生 于 2017-12-13 13:49 编辑
1 基本使用
列表的copy方法可以直接复制一份列表。
举例:
names=["aaa","bbb","ccc","ddd","eee"]
names1 = names.copy()
print (names1)
复制代码
结果:
['aaa', 'bbb', 'ccc', 'ddd', 'eee']
2 列表的嵌套
列表中可以再包含一个列表。举例:
names=[
"aaa"
,
"bbb"
,
"ccc"
,
"ddd"
,[
"fff"
,
"ggg"
],
"eee"
]
3 嵌套列表中的元素调用
如果要调用上面嵌套列表中的fff,怎么做呢?
举例:
names[4][0]="hhh"
执行结果为:
['aaa', 'bbb', 'ccc', 'ddd', ['hhh', 'ggg'], 'eee']
4 浅拷贝
浅拷贝只拷贝外面这一层,如果有嵌套列表的话,嵌套列表外面的值不会复制。这是因为嵌套列表是作为内存指针的形式存在的,所以被修改了,所有的拷贝都会被同步。代码:
names=["aaa","bbb","ccc","ddd",["fff","ggg"],"eee"]
names1=names.copy()
names[0]="AAA"
names[4][0]="FFF"
print(names)
print(names1)
复制代码
结果:
['AAA', 'bbb', 'ccc', 'ddd', ['FFF', 'ggg'], 'eee']
['aaa', 'bbb', 'ccc', 'ddd', ['FFF', 'ggg'], 'eee']
复制代码
可以看到,在调用浅拷贝names1=names.copy()之后,names的值修改了,但嵌套列表里面的FFF被同步修改了,而外面names[0]=“AAA”却没有被修改。因为
['FFF', 'ggg']是同一块内存地址,所以无论被多少个列表调用或者复制,那都一定会被同步的。因为是同一块内存地址。
5 深拷贝
深拷贝需要用到copy模块。但不要随便用深拷贝。
看代码:
import copy
names=["aaa","bbb","ccc","ddd",["fff","ggg"],"eee"]
names1=copy.deepcopy(names)
names[0]="AAA"
names[4][0]="FFF"
print(names)
print(names1)
复制代码
输出:
['AAA', 'bbb', 'ccc', 'ddd', ['FFF', 'ggg'], 'eee']
['aaa', 'bbb', 'ccc', 'ddd', ['fff', 'ggg'], 'eee']
复制代码
可以看到,names1拷贝完后,无论names如何变化,names1都不变了。这就是完全独立的两份数据了。
这也就是深度拷贝的概念,就是指的完全克隆。
(如果说要names变,names1也跟着完全变,那就不叫拷贝了,那就叫变量赋值了。就用names1 = names就可以了)
注意***:深拷贝不要随便用,因为这是完全独立的拷贝,会占两份内存地址和空间。
6 使用for循环来打印列表中的元素
代码:
names=["aaa","bbb","ccc","ddd",["fff","ggg"],"eee"]
for i in (names):
print(i)
复制代码
输出:
aaa
bbb
ccc
ddd
['fff', 'ggg']
eee
复制代码
对上述代码进行增强,只打印奇数位置的元素。代码:
names=["aaa","bbb","ccc","ddd",["fff","ggg"],"eee"]
print(names[0:-1:2]) #和names[::2]等价,因为0代表开始,-1代表最后1个。是可以省略的。
复制代码
输出:
['aaa', 'ccc', ['fff', 'ggg']]
复制代码
如果要分行打印,可以这样写:
names=["aaa","bbb","ccc","ddd",["fff","ggg"],"eee"]
for i in names[::2]:
print(i)
复制代码
输出:
aaa
ccc
['fff', 'ggg']
复制代码
欢迎光临 51学通信论坛2017新版 (http://bbs.51xuetongxin.com/)
Powered by Discuz! X3