主要是介绍python中的copy模块。
copy模块包括创建复合对象(包括列表、元组、字典和用户定义对象的实例)的深浅复制的函数。
########
copy(x)
########
创建新的复合对象并通过引用复制x的成员来创建x的浅复制。更加深层次说,
它复制了对象,但对于对象中的元素,依然使用引用。
对于内置类型,此函数并不经常使用。
而是使用诸如list(x), dict(x), set(x)等调用方式来创建x的浅复制,要知道像这样
直接使用类型名显然比使用copy()快很多。但是它们达到的效果是一样的。
还有一点就是对于那些不可修改的对象(string, 数字, 元组),因为你不用担心修改他们。复制不复制也就没有
什么大的意义了。
另外一点,你判断对象之间是否是拷贝,可以使用is运算符来确定。
a is b -> True a与b引用的是同一个对象,不是拷贝
-> False a与b是彼此拷贝对象
例如下面的例子,eg:
(1)
>>> a = [1,2,3]
>>> b = copy.copy(a)
>>> b
[1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3]
>>> a is b
False
(2)
>>> a = [1,2,3]
>>> b = a
>>> b
[1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> b.append(6)
>>> a, b
([1, 2, 3, 4, 6], [1, 2, 3, 4, 6])
(3)
>>> a = [1,2,3]
>>> b = list(a)
>>> b
[1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3]
>>>
(4)
>>> a = [[1], ['a'], ['A']]
>>> b = copy.copy(a)
>>> print a, b
[[1], ['a'], ['A']] [[1], ['a'], ['A']]
>>> b[1].append('b')
>>> b
[[1], ['a', 'b'], ['A']]
>>> a
[[1], ['a', 'b'], ['A']]
>>> b.append([100,101])
>>> b
[[1], ['a', 'b'], ['A'], [100, 101]]
>>> a
[[1], ['a', 'b'], ['A']]
在(3)例子当中,我们可以看到a的浅复制对象b,它们是不同的对象,所以对对象的改变是不会
影响彼此的,但是这些a和b对象的元素是引用的同一个,所以a或者b更改了它的对象的元素就会影响到
另外一个的值。
如果你想完全的拷贝一个对象和一个对象的所有元素的值,只有使用下面的deepcopy()函数。
#######################
deepcopy(x[, visit])
#######################
通过创建新的复合对象并重复复制x的所有成员来创建x的深复制。
visit是一个可选的字典,目的是跟踪受访问的对象,从而检测和避免重复定义
的数据结构中的循环。
尽管通常情况下不需要,但是通过实现方法__copy__(self)和__deepcopy__(self, visit),
类就可以实现自定义的复制方法,这两个方法分别实现了浅复制和深复制操作。
__deepcopy__()方法必须使用字典visit,用来在复制过程中跟踪前面遇到的对象。对于
__deepcopy__()方法,除了将visit传到实现中包含的其他deepcopy()方法(如果有的话)之外,
没有必要在执行其他操作。
如果类实现了pickle模块所用的方法__getstate__()和__setstate__(),那么copy模块将使用
这些方法来创建副本。
,但是通过实现方法__copy__(self)和__deepcopy__(self, visit),
类就可以实现自定义的复制方法,这两个方法分别实现了浅复制和深复制操作。
__deepcopy__()方法必须使用字典visit,用来在复制过程中跟踪前面遇到的对象。对于
__deepcopy__()方法,除了将visit传到实现中包含的其他deepcopy()方法(如果有的话)之外,
没有必要在执行其他操作。
如果类实现了pickle模块所用的方法__getstate__()和__setstate__(),那么copy模块将使用
这些方法来创建副本。,但是通过实现方法__copy__(self)和__deepcopy__(self, visit),
类就可以实现自定义的复制方法,这两个方法分别实现了浅复制和深复制操作。
__deepcopy__()方法必须使用字典visit,用来在复制过程中跟踪前面遇到的对象。对于
__deepcopy__()方法,除了将visit传到实现中包含的其他deepcopy()方法(如果有的话)之外,
没有必要在执行其他操作。
如果类实现了pickle模块所用的方法__getstate__()和__setstate__(),那么copy模块将使用
这些方法来创建副本。
eg:
>>> a = [[1], ['a'], ['A']]
>>> import copy
>>> b = copy.deepcopy(a)
>>> b
[[1], ['a'], ['A']]
>>> c = copy.copy(a)
>>> c
[[1], ['a'], ['A']]
>>> a[1].append('b')
>>> a
[[1], ['a', 'b'], ['A']]
>>> b
[[1], ['a'], ['A']]
>>> c
[[1], ['a', 'b'], ['A']]
需要注意的是:
(1) copy模块用于像整数和字符串这样的简单类型,不过很少需要这么做。
(2) 这些复制函数无法与模块、类对象、函数、方法、回溯、栈帧、文件、套接字和其他类似类型同时工作。
如果不能复制对象,则会引发copy.error异常。
以上是深入了解python中的copy模块(浅复制和深复制)的详细内容。更多信息请关注PHP中文网其他相关文章!

Tomergelistsinpython,YouCanusethe操作员,estextMethod,ListComprehension,Oritertools

在Python3中,可以通过多种方法连接两个列表:1)使用 运算符,适用于小列表,但对大列表效率低;2)使用extend方法,适用于大列表,内存效率高,但会修改原列表;3)使用*运算符,适用于合并多个列表,不修改原列表;4)使用itertools.chain,适用于大数据集,内存效率高。

使用join()方法是Python中从列表连接字符串最有效的方法。1)使用join()方法高效且易读。2)循环使用 运算符对大列表效率低。3)列表推导式与join()结合适用于需要转换的场景。4)reduce()方法适用于其他类型归约,但对字符串连接效率低。完整句子结束。

pythonexecutionistheprocessoftransformingpypythoncodeintoExecutablestructions.1)InternterPreterReadSthecode,ConvertingTingitIntObyTecode,whepythonvirtualmachine(pvm)theglobalinterpreterpreterpreterpreterlock(gil)the thepythonvirtualmachine(pvm)

Python的关键特性包括:1.语法简洁易懂,适合初学者;2.动态类型系统,提高开发速度;3.丰富的标准库,支持多种任务;4.强大的社区和生态系统,提供广泛支持;5.解释性,适合脚本和快速原型开发;6.多范式支持,适用于各种编程风格。

Python是解释型语言,但也包含编译过程。1)Python代码先编译成字节码。2)字节码由Python虚拟机解释执行。3)这种混合机制使Python既灵活又高效,但执行速度不如完全编译型语言。

useeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.ForloopSareIdeAlforkNownsences,而WhileLeleLeleLeleLoopSituationSituationSituationsItuationSuationSituationswithUndEtermentersitations。

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐个偏置,零indexingissues,andnestedloopineflinefficiencies


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。