对象的浅拷贝(class 个实例)

Shallow copy of an object (class instance)

我正在尝试理解浅拷贝(参考)。

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

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

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)

这产生:

<__main__.Foo object at 0x03B21110>
<__main__.Foo object at 0x03AFB5B0>
<__main__.Foo object at 0x03B21150>

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

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

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

如果您已经为 x 的值创建了一个 Foo 对象,那么这将是对 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)