浅层副本(类实例)

时间:2018-06-12 17:12:41

标签: python-3.x reference python-3.6 shallow-copy

我正在尝试理解浅层副本(参考文献)。

我创建了一个类,如果它已经存在,它应该生成一个实例的浅表副本,但是我的代码正在创建单独的实例。

这里的意图是,如果我尝试创建一个与现有对象具有相同x值的新对象,我应该创建对现有对象的引用,而不是新对象。

undefined

这会产生:

from copy import copy


class Foo(object):
    def __init__(self, x):
        seen = set()
        if x not in seen:
            self.x = x
            seen.add(x)
        else:
            self.x = copy(self.x)


f1 = Foo(10)
f2 = Foo(10)
f3 = Foo(10)

s = {f1, f2, f3}

for i in s:
    print(i)

我应该在集合中只有一个对象(在本例中),因为所有对象都是使用相同的x值创建的。

1 个答案:

答案 0 :(得分:0)

您正在创建Foo.x的浅表副本,但是您要打印Foo对象,而不是您创建的引用。尝试将print()语句更改为:

print(hex(id(i.x)))

如果您已经为该值x:

创建了一个对象,则会返回对Foo对象的引用
seen = {}


class Foo:
    def __init__(self, x):
        self.x = x

    @classmethod
    def new(cls, x):
        if x not in seen:
            seen[x] = cls(x)
        return seen[x]


f1 = Foo.new(10)
f2 = Foo.new(10)
f3 = Foo.new(10)

s = {f1, f2, f3}

for i in s:
    print(i)