您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

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

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

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

@H_502_5@>>> 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]

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

@H_502_5@>>> 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
()

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

我不知道为什么您的原始代码不起作用,但是您可能遇到了与我在列表中显示代码段有关的行为,因为@H_502_5@PointDistance认情况下您的类也是可变的。一个替代方法是@H_502_5@namedtuplefrom的类@H_502_5@collections,该类构造一个类似元组的对象,其字段也可以通过名称进行访问。例如,您可以这样做:

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

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

最后,我想补充一点,就是@H_502_5@deepcopy到目前为止我从来没有用过,所以我想在大多数情况下有避免这种情况的方法

python 2022/1/1 18:26:51 有179人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶