1

关于 Python 中的 deepcopy 的一个问题:

我有一个 A 类,其中包含 B 类中的对象列表,还有一个 C 类,其中包含 A 类中的对象列表。

class A(object):
    def __init__(S):
        self.S = set(S)

class B(object):
    def __init__(buddies):
        self.buddies = set(buddies)

class C(object):
    def __init__(L):
        self.L = set(L)
    def SplitA(a,b):
        left = deepcopy(a)
        left.S -= new_b.buddies
        right = A(new_b.buddies)
        L |= left
        L |= right

所以我希望 C 有一个 Split 函数,给定一个 A 对象a和一个 B 对象bin a.S,它将生成两个新的 A 对象:一个包含b(在 中a.S)的“伙伴”,一个包含a.S.

问题是,我不知道如何弄清楚指定的 b 在 deepcopy 中变成了什么。换句话说,

如何new_b在上面的代码中找到?

(注意:在我的实际代码中,按此顺序进行操作很重要,即添加new_a然后拆分aleft并且right不起作用。)

4

2 回答 2

1

答案是指定的 b 在深拷贝中不会变成除 b 以外的任何东西,因为您根本没有在深拷贝 b。因此,只需在您的示例中替换new_b为。b

于 2013-08-02T05:15:23.943 回答
0

此代码应该可以满足您的需求。

from copy import deepcopy


class A(object):
    def __init__(self, S):
        self.S = set(S)


class B(object):
    def __init__(self, buddies):
        self.buddies = set(buddies)


class C(object):
    def __init__(self, L):
        self.L = set(L)

    def SplitA(self, a, b):
        left = set()
        left -= b.buddies   # Since the objects in the sets are unchanged
                            # you can do a set difference that will leave you
                            # with only the members of a that are not in b
        left = deepcopy(left)  # Now get a deep copy of left
        right = deepcopy(b.S)  # and a deep copy of b.S
        self.L |= left      # and combine them
        self.L |= right
于 2013-08-02T08:30:10.837 回答