问题标签 [deep-copy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
410 浏览

c# - 在几个类中干燥 ICloneable 的实现

我有几个不同的类希望被克隆: GenericRowGenericRowsParticularRowParticularRows. 有以下类层次结构: GenericRow是 的父级ParticularRow,并且GenericRows是 的父级ParticularRows。每个类都实现ICloneable,因为我希望能够创建每个实例的深层副本。Clone()我发现自己为每个类编写完全相同的代码:

然后我提供了一个方便的包装方法,例如GenericRows

我对每个类中看起来大致相同的便利包装器方法感到满意,因为它的代码非常少,而且它在返回类型、强制类型转换等方面确实因类而异。但是,在所有四个类中ICloneable.Clone()都是相同的。我可以以某种方式抽象它,以便它只在一个地方定义吗?我担心的是,如果我制作了一些实用程序类/object扩展方法,它不会正确地制作我想要复制的特定实例的深层副本。无论如何,这是个好主意吗?

0 投票
2 回答
1073 浏览

python - 复制字典和在 SQLAlchemy ORM 对象上使用 deepcopy 的问题

我正在做一个模拟退火算法来优化给定的学生和项目分配。

这是来自 Wikipedia 的与语言无关的伪代码:

以下是该技术的改编。我的主管说这个想法在理论上是好的。

首先,我从整组随机分配中提取一些分配(即整个学生词典及其分配的项目,包括项目的排名),将其复制并传递给我的函数。我们称之为分配aOld(它是一个字典)。aOld有一个与之相关的权重,称为wOld。权重如下所述。

该函数执行以下操作:

  • 让这个分配,aOld成为best_node
  • 从所有学生中,选择随机数量的学生并粘贴在列表中
  • 剥离(DEALLOCATE)他们的项目++反映项目的变化(allocated参数现在False)和讲师(如果他们的一个或多个项目不再分配,则释放空位)
  • 随机化该列表
  • 再次尝试分配(REALLOCATE)该列表项目中的每个人
  • 计算权重(将排名相加,排名 1 = 1,排名 2 = 2...并且没有项目排名 = 101)
  • 对于这个新的分配aNew,如果权重wNew小于wOld我一开始选择的分配权重,那么这就是best_node(由上面的Simulated Annealing算法定义)。将算法应用于aNew并继续。
  • 如果wOld < wNew,则再次应用该算法aOld并继续。

分配/数据点表示为“节点”,使得node = (weight, allocation_dict, projects_dict, lecturers_dict)

现在,我只能执行这个算法一次,但我需要尝试一个数字 N(kmax在 Wikipedia 片段中表示)并确保我总是随身携带,previousnodebest_node.

为了不修改我原来的字典(我可能想重置),我做了字典的浅拷贝。从我在文档中阅读的内容来看,它似乎只复制引用,并且由于我的字典包含对象,因此更改复制的字典最终会更改对象。所以我尝试使用copy.deepcopy()。这些字典引用了已经用 SQLA 映射的对象。


Questions:

我已经为所面临的问题提供了一些解决方案,但由于我使用 Python 的超绿色能力,它们对我来说听起来都相当神秘。

  1. Deepcopy 不能很好地与 SQLA 配合使用。有人告诉我,ORM 对象上的深拷贝可能存在阻止它按预期工作的问题。显然,我最好“构建复制构造函数,即 def copy(self): return FooBar(....)”。有人可以解释一下这是什么意思吗?

  2. 我检查并发现deepcopy存在问题,因为 SQLAlchemy 在您的对象上放置了额外的信息,即_sa_instance_state属性,我不希望在副本中但对于对象来说是必需的。有人告诉我:“有一些方法可以手动清除旧的_sa_instance_state并在对象上放置一个新的,但最直接的方法是创建一个新对象__init__()并设置重要的属性,而不是做一个完整的深拷贝。” 这到底是什么意思呢?我是否创建了一个新的、未映射的类,类似于旧的映射类?

  3. 另一种解决方案是我必须“__deepcopy__()在您的对象上实现并确保设置了新的 _sa_instance_state,sqlalchemy.orm.attributes 中有一些函数可以帮助解决这个问题。” 再一次,这超出了我的范围,所以有人可以解释一下这是什么意思吗?

  4. 一个更普遍的问题:鉴于上述信息,是否有任何关于如何维护信息/状态的建议best_node(必须始终通过我的 while 循环持续存在)和previous_node,如果我的实际对象(由字典引用,因此节点) 是否由于发生解除分配/重新分配而发生变化?也就是说,不使用副本?

0 投票
1 回答
811 浏览

.net - IronPython 中的深度复制

我想在 IronPython 中做一个深拷贝,但是当我写的时候

我明白了no module named copy

如何在 IronPython 中进行深度复制?

0 投票
4 回答
4289 浏览

python - 如何在 Python 中“覆盖”深度复制?

我想覆盖__deepcopy__给定的 SQLAlchemy 映射类,以便它忽略任何 SQLA 属性,但深度复制属于该类的所有其他内容。

我不是特别熟悉重写任何 Python 的内置对象,但我对我想要什么有所了解。

让我们创建一个User使用 SQLA 映射的非常简单的类。

我曾经dir()在映射之前和之后看到有哪些特定于 SQLAlchemy 的属性,并且我发现_sa_class_manager_sa_instance_state.

Questions
如果这些是唯一的,我在定义时如何忽略它__deepcopy__
此外,SQLA 是否有任何属性注入到映射对象中?


(我在上一个问题中问过这个问题(不过,在我选择了主要问题的答案几天后进行了编辑),但我想我错过了那里的火车。为此道歉。)


Edit - Fixed code thanks to zifot's answer

我从 Python 文档中得到的唯一一件事是您需要将 deepcopy with 定义memo为一个额外的参数。经过一点点挖掘后,我尝试了这个:

然后我创建了一个实例User

之后,我尝试了以下deepcopy操作:

...并且snake_dc仍然具有 SQLA 属性...

我愿意提供帮助、建议等。

0 投票
2 回答
21252 浏览

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

我有一个非常简单的 python 例程,其中涉及循环遍历大约 20,000 个纬度、经度坐标的列表并计算每个点到参考点的距离。

我最初是用 C 语言编写的,使用完全相同的方法,它在那里工作得很好,并且对于 nPoints<=100 基本上是瞬时的。所以我决定将它移植到 python,因为我想使用 SqlAlchemy 来做一些其他的事情。

我第一次移植它时没有现在使用该方法的 deepcopy 语句,这导致结果“奇怪”或部分不正确,因为某些点只是被复制为引用(我猜?我想?)-但它仍然几乎和 C 版本一样快。

现在添加了 deepcopy 调用,该例程可以正常工作,但它已经招致了极大的性能损失,现在需要几秒钟才能完成相同的工作。

这似乎是一项很常见的工作,但我显然不是以 Python 的方式来做的。我应该怎么做才能得到正确的结果,但不必在任何地方都包含 deepcopy?

编辑:
我找到了一个更简单、更快的解决方案,

所以基本上我只是制作输入的完整副本并附加一个新值 - 与参考点的距离。然后我只是将“排序”应用于结果列表,指定排序键应该是 PointDistance 对象的距离属性。

这比使用 deepcopy 快得多,尽管我承认我真的不明白为什么。我想这取决于高效的 C 实现 python 的“排序”?

0 投票
1 回答
384 浏览

silverlight - 集合中的对象到对象属性映射

我正在创建(动态生成的类型)集合以在silverlight 网格中显示,其中一个过程涉及创建导入(动态生成的类型)类型,然后将导入类型上的属性映射到(动态生成的类型)这两种类型的集合共享一个标识项目的 Id 属性(无论是在网格上还是在导入中)

即类型绑定到网格

并导入类型

ids 匹配的地方我想复制 foos.

在集合中将属性从一种类型映射到另一种类型的快速方法是什么?

编辑

多亏了 Stephan,这是最终的 Typemapper 实现,因为一个功能只会在 keymembers 相等时映射两种类型,通过表示成员名称的字典字符串定义的映射,在 silverlight 中工作

0 投票
3 回答
24538 浏览

java - Java 对象复制的最佳选择?

可能重复:
如何在 Java 中复制对象?

我需要在 Java 中复制一个对象(即“按值而不是按引用”复制对象,以便新对象不仅仅是对旧对象的引用)。我厌倦了实现可克隆并且更喜欢使用复制构造函数。但是,我需要复制的类有许多需要复制的成员变量(超过 100 个),因此向该类添加一个新的构造函数只是为了复制(仅在我的应用程序的一部分中需要)似乎是一个糟糕的解决方案由于其巨大的长度。

有更好的解决方案吗?我应该只使用克隆()吗?我可以创建一个复制构造函数,但不是将所有字段一一复制,我可以反思吗?谢谢。

我基本上只需要创建一个与旧对象相同的新对象,但更改了一些(大约 100 个中的 10 个)字段(但我仍然需要两个对象..所以新对象不能作为对旧的)。我愿意接受任何建议。

0 投票
1 回答
56 浏览

gdi+ - 对象库 - 访问索引值还是对象本身?(例如,也许是深拷贝还是浅拷贝?)

我一直对 .Net 如何复制引用感到困惑/不确定。假设我有一个 GDI+ 的位图对象。

'Foo' 保存位图对象。现在假设我这样做。

这是浅拷贝还是深拷贝?如果我将 foo 设置为无,bar 是否也会突然引用“无”?或者 bar 是否也包含位图的副本,并且为了从内存中完全删除位图,我需要将 'foo' 和 'bar' 都设置为空?

我需要在内存中保留一个位图库,对我来说,将每个创建的对象中每个位图的引用存储为变量会更容易,而不是使用索引对其进行编码并且每次都必须引用该库需要它(例如'BitmapLibrary.Singleton.getBitmap(id)')

简而言之,我可以这样做:

而不是这个:

0 投票
2 回答
346 浏览

ruby - How to create an operator for deep copy/cloning of objects in Ruby?

I would like to achieve the following by introducing a new operator (e.g. :=)

As far as I understand, I need to modify the Object class, but I don't know what to do in order to get what I want.

Could you help me with this?


Update

Ok, superators will probably not help me here, but I still want such operator. How can I (or you) create an extension for Ruby, which I could load as a module?

0 投票
3 回答
677 浏览

java - CXF:来自 wsdl2java 的可克隆类?

是否可以让 CXF 的 wsdl2java 发出可克隆的类?也许通过一些选项或插件?

我需要做的是按值将一个相当复杂的模式结构从一个对象树复制到另一个对象树,而不是手动获取/设置每个成员值或手动触摸生成的类。

/比约恩