如何为每个对象复制具有无地址的对象数组

问题描述

如果我使用copy.deepcopy()在同一地址复制5个对象的数组,它们将全部获得一个新地址,但仍然不会出错。我需要所有对象都是唯一的(在不同的地址)。

import numpy as np
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age


p = Person("John",10)
a = np.array([p,p,p])
new_arr = copy.deepcopy(a)

之前:

[<__main__.Person object at 0x7fa608716a60>
 <__main__.Person object at 0x7fa608716a60>
 <__main__.Person object at 0x7fa608716a60>
 <__main__.Person object at 0x7fa608716a60>
 <__main__.Person object at 0x7fa608716a60>]

之后:

[<__main__.Person object at 0x7fa608716520>
 <__main__.Person object at 0x7fa608716520>
 <__main__.Person object at 0x7fa608716520>
 <__main__.Person object at 0x7fa608716520>
 <__main__.Person object at 0x7fa608716520>]

这可行(但速度很慢)-我正在寻找最快的解决方案。想象一下,数组有1000000+个对象。

new_arr = []
for x in arr:
    new_arr.append(copy.copy(x))

应该如何

[<__main__.Person object at 0x7f40f6fdc5e0>
 <__main__.Person object at 0x7f40f7099100>
 <__main__.Person object at 0x7f40f7099e20>
 <__main__.Person object at 0x7f40f7099130>
 <__main__.Person object at 0x7f40f7090940>]

解决方法

更改您的类以实现copy(),以便deepcopy()在您的自定义对象上起作用。

from copy import deepcopy

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __copy__(self):
        return Person(self.name,self.age)

    def __deepcopy__(self,memo):
        return Person(deepcopy(self.name,memo),deepcopy(self.age,memo))
,

正如@khelwood所说,使用列表理解,但我不知道速度:

>>> import numpy as np
>>> import copy
>>> Class Person:
    def __init__(self,age):
        self.name = name
        self.age = age

        
>>> p = Person('John',42)
>>> p
<__main__.Person object at 0x0000017C55E06BB0>

>>> a = np.array([copy.deepcopy(p) for i in range(5)])
>>> a
array([<__main__.Person object at 0x0000017C64768580>,<__main__.Person object at 0x0000017C64768610>,<__main__.Person object at 0x0000017C64768670>,<__main__.Person object at 0x0000017C64768730>,<__main__.Person object at 0x0000017C64768790>],dtype=object)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...