栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

deepcopy和python-避免使用的提示?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

deepcopy和python-避免使用的提示?

好的,首先要做最简单的事情:

  1. deepcopy
    通常,它很慢,因为它必须进行大量内部记账来复制病理性案例,例如以理智的方式包含其自身的对象。见,例如,该页面,或者看看的源代码
    deepcopy
    copy.py
    是在你的Python路径的某处。

  2. sorted
    速度快,因为它是用C实现的。比Python中的同类排序要快得多。

现在,正如您在评论中所要求的那样,有关Python的引用计数行为还有更多内容。在Python中,变量是引用。当您说时

a=1
,请考虑它具有
1
作为一个对象存在的对象,它
a
只是附加到它的标签。在其他一些语言(例如C)中,变量是容器(而不是标签),执行此操作时
a=1
,实际上是将1放入
a
。这不适用于Python,变量是引用。这可能带来一些有趣的结果,您可能还偶然发现:

>>> a = []      # construct a new list, attach a tag named "a" to it>>> b = a       # attach a tag named "b" to the object which is tagged by "a">>> a.append(1) # append 1 to the list tagged by "a">>> print b     # print the list tagged by "b"[1]

之所以会出现这种现象,是因为列表是 可变 对象:您可以在创建列表后对其进行修改,并且在通过引用该列表的任何变量访问列表时都可以看到该修改。列表的
不可变 等价为元组:

>>> a = ()      # construct a new tuple, attach a tag named "a" to it>>> b = a       # now "b" refers to the same empty tuple as "a">>> a += (1, 2) # appending some elements to the tuple>>> print b()

在这里,

a += (1, 2)
创建了一个 新的 从现有的元组的元组由简称
a
,加上又是元组
(1,2)
是在即时构建,并
a
调整为指向新的元组,而当然
b
还是旧指元组。简单的数字加法也会发生相同的情况,例如
a =a+2
:在这种情况下,最初由
a
所指向的数字不会以任何方式发生突变,Python会“构造”一个​​新数字并
a
指向新数字。简而言之,数字,字符串和元组是不可变的;列表,字典和集合是可变的。用户定义的类通常是可变的,除非您明确确保内部状态不能突变。还有
frozenset
,这是一个不变的集合。当然还有其他很多:)

我不知道为什么您的原始代码不起作用,但是您可能遇到了与我在列表中显示的代码段有关的行为,因为

PointDistance
默认情况下您的类也是可变的。一个替代方法是
namedtuple
from的类
collections
,该类构造一个类似元组的对象,其字段也可以通过名称进行访问。例如,您可以这样做:

from collections import namedtuplePointDistance = namedtuple("PointDistance", "point distance")

这会

PointDistance
为您创建一个具有两个命名字段的类:
point
distance
。在主
for
循环中,您可以适当地分配它们。由于
point
字段指向的点对象在
for
循环过程中不会被修改,
distance
而是一个数字(根据定义,它是不可变的),因此您应该放心地这样做。但是是的,总的来说,由于使用了C语言,因此使用起来似乎
sorted
更快
sorted
。您可能还很幸运使用该
heapq
模块,该模块实现了由普通Python列表支持的堆数据结构,因此可以
k
轻松地找到顶部元素无需对其他排序。但是,由于
heapq
也是在Python中实现的,因此很有可能
sorted

除非您有很多要点,否则效果会更好。

最后,我想补充一点,就是

deepcopy
到目前为止我从来没有用过,所以我想在大多数情况下有避免这种情况的方法。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/647290.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号