background image
2
3
4
5
6
7
8
9
10
11
12
# encoding: utf-8
# -*- coding: utf8 -*-
import
re
from
copy
import
deepcopy
old_list
=
[
'# '
,
'# conf'
,
'NAME="Ubuntu"'
,
'VERSION="14.04.3 LTS, T
rusty Tahr"'
]
new_list
=
deepcopy(old_list)
for
member
in
new_list:
if
re.search(
'^#+.*'
, member)
is not
None
:
old_list.remove(member)
print
old_list
有趣(令人困惑)的是切片也是浅复制,但利用切片也可以实现上述功能,代码如下:
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
import
re
old_list
=
[
'# '
,
'# conf'
,
'NAME="Ubuntu"'
,
'VERSION="14.04.3 LTS, T
rusty Tahr"'
]
new_list
=
old_list[:]
for
member
in
new_list:
if
re.search(
'^#+.*'
, member)
is not
None
:
old_list.remove(member)
print
old_list
上述导致错误发生的例子(在 for 循环中用 remove 同一个列表)可以认知为这个操作是修
改对象势必影响此对象,要想修改一个对象却不影响此对象引用,则需要对象复制。如果你
想修改一个对象,而且想让原始的对象不受影响,那你就需要对象复制。
附加知识点:
关于浅复制(浅拷贝)
对象的浅复制(shallow copy):它虽然复制了对象,但对于对象中的元素,依然使用引用.
(1)、使用切片[:]操作进行拷贝 (注释:切片只复制了对象的顶层,对对象的下一层还是
引用,举个例子:[1,2,3,[4,5,6]])
(2)、使用工厂函数(如 list/dir/set)等进行拷贝
(3)、copy.copy()
(4)、=(赋值)操作(注释:原文没有,此处是新添加的,根据“对象的赋值实际上是对象
的引用”添加)
如果希望复制一个容器对象,以及它里面的所有元素(包含元素的子元素),使用
copy.deepcopy 这个方法会消耗一些时间和空间。不过,如果你需要完全复制,这是唯一的
方法。