python对象复制

  百度版lol百科小样

需求:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <title>英雄联盟百科</title>
 5     <meta charset="UTF-8">
 6 </head>
 7 <body>
 8 <!-- 文档:logo区 -->
 9 <div style="border: 1px solid red;width:800px;margin:0 auto;">
10 <img src="..sd.jpg"/>
11 </div>
12 <!-- 内容区 -->
13 <div style="border: 1px solid red;width:800px;margin:0 auto;">
14 <h1>英雄联盟</h1>
15     <p>xxxxxxxxxxx</p>
16     <h2>目录</h2>
17     <ol>
18         <li>
19             <!-- 加"游戏背景"链接 -->
20             <a href="#button1" target="_self">1、游戏背景</a>
21             <ul>
22                 <li>战争学院</li>
23                 <li>德玛西亚</li>
24             </ul>
25         </li>
26         <li>
27             2、游戏系统
28             <ul>
29                 <li>天赋</li>
30                 <li>符文</li>
31             </ul>
32         </li>
33     </ol>
34     <h2>1、xxxx</h2>
35     <h3>xx系统</h3>
36     <table  width="70%">
37         <tr>
38             <td>中文名</td>
39             <td>英雄联盟</td>
40             <td>发行商</td>
41             <td>riot</td>
42         </tr>
43         <tr>
44             <td>其他名称</td>
45             <td>lol</td>
46             <td>发型日期</td>
47             <td>2011.11.2</td>
48         </tr>
49         <tr>
50             <td>游戏类型</td>
51             <td>moba</td>
52             <td>玩家人数</td>
53             <td>多人</td>
54         </tr>
55         <tr>
56             <td>游戏平台</td>
57             <td>pc</td>
58             <td>游戏画面</td>
59             <td>3d</td>
60         </tr>
61     </table>
62     <!-- 加“游戏背景”锚点 -->
63     <p><a name="button1" target="_self">游戏背景</a></p>
64     <p>xxxxxxxxxxxx</p>
65 </div>
66 <!-- 版权区 -->
67 <div style="border: 1px solid red;width:800px;margin:0 auto;">
68 <p align="center">&copy;2016 使用xx用户协议</p>
69 </div>
70 </body>
71 </html>

你想复制一个对象.因为在Python中,无论你把目标做为参数传递,做为函数重回值,都是引用传递的.

 

讨论:

标准库中的copy模块提供了七个章程来兑现拷贝.一个措施是copy,它回到和参数包含内容一律的对象.

import
copy
new_list
= copy.copy(existing_list)

多少时候,你指望对象中的属性也被复制,能够接纳deepcopy方法:

import
copy
new_list_of_dicts
= copy.deepcopy(existing_list_of_dicts)

当您对一个目标赋值的时候(做为参数传递,或者做为再次回到值),Python和Java一样,总是传递原始对象的引用,而不是一个副本.其余一些语言当赋值的时候总是传递副本.Python从不怀疑用户的急需
,倘诺您想要一个副本,你必须显式的要求.
Python的作为很简短,急速,而且一致.不过,如果你需要一个对象拷贝而并没有显式的写出来,会出现问题的,比如:

>>> a = [1, 2, 3]
>>> b = a
>>> b.append(5)
>>> print a, b 
[1, 2, 3, 5] [1, 2, 3, 5]

在此间,变量a和b都对准同一个对象(一个列表),所以,一旦您改改了两边之一,另外一个也会晤临影响.无论怎么着,都会修改原来的对象.
注意:

要想变成一个Python高手,首先要注意的问题就是目的的变更操作和赋值,它们都是对准对象的引用操作的.一个话语比如a

[]将a重新绑定给一个新目的,但不会潜移默化此前的对象.但是,对象复制却今非昔比,当对象复制后,对象变更操作就有了区别. 
假若你想修改一个对象,而且想让原本的靶子不受影响,这您就需要对象复制.正如本节说的如出一辙,你可以动用copy模块中的四个章程来实现需求.一般的,可以使用copy.copy,它可以举办对象的浅复制(shallow
copy),它复制了目标,但对此目标中的元素,依旧接纳引用.
浅复制,有时无法拿到一个和原先对象完全一致的副本,假设你想修改对象中的元素,不仅仅是目的自我的话:

>>>
list_of_lists = [ [‘a’], [1, 2], [‘z’, 23] ]
>>>
copy_lol = copy.copy(lists_of_lists) 
>>>
copy_lol[1].append(‘boo’) 
>>>
print list_of_lists, copy_lol 
[[‘a’],
[1, 2, ‘boo’], [‘z’, 23]] [[‘a’], [1, 2, ‘boo’], [‘z’,
23]] 

在这里,变量list_of_lists,copy_lol指向了多少个例外的靶子,所以我们可以修改它们别样一个,
而不影响其它一个.不过,假使大家修改了一个对象中的元素,那么另一个也会受影响,因为它们中的元素依旧共享引用.
一旦您愿意复制一个容器对象,以及它其中的有所因素(包含元素的子元素),使用copy.deepcopy,这多少个方法会消耗一些时间和空中,然而,即使你需要完全复制,这是绝无仅有的方法.
对此一般的浅拷贝,使用copy.copy就可以了,当然,你需要领悟您要拷贝的对象.要复制列表L,使用list(L),要复制一个字典d,使用dict(d),要复制一个集合s,使用set(s),这样,我们总计出一个法则,如果你要复制一个目标o,它属于内建的类型t,那么你可以使用t(o)来
得到一个拷贝.dict也提供了一个复制版本,dict.copy,这一个和dict(d)是同一,我推荐你采纳后者,这一个使得代码更平等,而且还少几个字符.
要复制一个此外类型,无论是你协调写的要么利用库中的,使用copy.copy,假设您自己写一个类,没有必要费神去写clone和copy函数,假如您想定义自己的类复制的措施,实现一个__copy__,或者__getstate__和__setstate__.假如你想定义自己类型的deepcopy,实现形式__deepcopy__. 
瞩目你不要复制不可修改对象(string,数字,元组),因为您绝不操心修改它们.假设你想尝尝一下复制,依然会取得原来的.即使无伤大雅,然而确实浪费尽力:

>>>
s = ‘cat’ 
>>>
t = copy.copy(s) 
>>>
s is t 
**True

*is操作符用于不仅判断三个目的是否完全一致,而且是同一个目的(is判断标识符,要相比内容,使用==),判断标识符是否等于对于不可修改对象没有什么样意义.但是,判断标识符对于可修改对象有时候是很重点的,比如,你不确定a和b是否针对同一个对象,使用a
is b会登时得到结果.这样您可以友善看清是否需要动用对象拷贝.
注意:
你可以应用另一种拷贝情势,给定一个列表L,无论是整机切片L[:]要么列表解析[x
for x in
L],都会拿到L的浅拷贝,试试L+[],L\
1…然而地方二种格局都会使人迷惑,使用list(L)最明显和快捷,当然,由于历史由来,你或许会时时看到L[:]的写法. 
对此dict,你恐怕见过下边的复制方法:
>>>
for somekey in d: 

d1[somekey] = d[somekey]

仍然更简便一些的点子,d1={},d1.update(d),无论怎么着,那些代码都是缺乏效用的,使用d1=dict(d)吧.

连带阐明:

copy(x)
    Shallow copy operation on arbitrary Python objects.

    See the module’s __doc__ string for more info. 

deepcopy(x,
memo=None, _nil=[])
    Deep copy operation on arbitrary Python objects.

    See the module’s __doc__ string for more info.

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website