51学通信论坛2017新版

标题: 1.11 列表的copy方法(深拷贝和浅拷贝) [打印本页]

作者: 爱卫生    时间: 2017-12-12 22:38
标题: 1.11 列表的copy方法(深拷贝和浅拷贝)
本帖最后由 爱卫生 于 2017-12-13 13:49 编辑

1 基本使用
列表的copy方法可以直接复制一份列表。
举例:
  1. names=["aaa","bbb","ccc","ddd","eee"]
  2. names1 = names.copy()
  3. 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 浅拷贝
浅拷贝只拷贝外面这一层,如果有嵌套列表的话,嵌套列表外面的值不会复制。这是因为嵌套列表是作为内存指针的形式存在的,所以被修改了,所有的拷贝都会被同步。代码:
  1. names=["aaa","bbb","ccc","ddd",["fff","ggg"],"eee"]
  2. names1=names.copy()
  3. names[0]="AAA"
  4. names[4][0]="FFF"
  5. print(names)
  6. print(names1)
复制代码
结果:
  1. ['AAA', 'bbb', 'ccc', 'ddd', ['FFF', 'ggg'], 'eee']
  2. ['aaa', 'bbb', 'ccc', 'ddd', ['FFF', 'ggg'], 'eee']
复制代码
可以看到,在调用浅拷贝names1=names.copy()之后,names的值修改了,但嵌套列表里面的FFF被同步修改了,而外面names[0]=“AAA”却没有被修改。因为['FFF', 'ggg']是同一块内存地址,所以无论被多少个列表调用或者复制,那都一定会被同步的。因为是同一块内存地址。


5 深拷贝
深拷贝需要用到copy模块。但不要随便用深拷贝。
看代码:
  1. import copy
  2. names=["aaa","bbb","ccc","ddd",["fff","ggg"],"eee"]
  3. names1=copy.deepcopy(names)
  4. names[0]="AAA"
  5. names[4][0]="FFF"
  6. print(names)
  7. print(names1)
复制代码
输出:
  1. ['AAA', 'bbb', 'ccc', 'ddd', ['FFF', 'ggg'], 'eee']
  2. ['aaa', 'bbb', 'ccc', 'ddd', ['fff', 'ggg'], 'eee']
复制代码
可以看到,names1拷贝完后,无论names如何变化,names1都不变了。这就是完全独立的两份数据了。
这也就是深度拷贝的概念,就是指的完全克隆。
(如果说要names变,names1也跟着完全变,那就不叫拷贝了,那就叫变量赋值了。就用names1 = names就可以了)

注意***:深拷贝不要随便用,因为这是完全独立的拷贝,会占两份内存地址和空间。



6 使用for循环来打印列表中的元素
代码:
  1. names=["aaa","bbb","ccc","ddd",["fff","ggg"],"eee"]
  2. for i in (names):
  3.     print(i)
复制代码
输出:
  1. aaa
  2. bbb
  3. ccc
  4. ddd
  5. ['fff', 'ggg']
  6. eee
复制代码
对上述代码进行增强,只打印奇数位置的元素。代码:
  1. names=["aaa","bbb","ccc","ddd",["fff","ggg"],"eee"]
  2. print(names[0:-1:2])  #和names[::2]等价,因为0代表开始,-1代表最后1个。是可以省略的。
复制代码
输出:
  1. ['aaa', 'ccc', ['fff', 'ggg']]
复制代码
如果要分行打印,可以这样写:
  1. names=["aaa","bbb","ccc","ddd",["fff","ggg"],"eee"]
  2. for i in names[::2]:
  3.     print(i)
复制代码
输出:
  1. aaa
  2. ccc
  3. ['fff', 'ggg']
复制代码





欢迎光临 51学通信论坛2017新版 (http://bbs.51xuetongxin.com/) Powered by Discuz! X3