我正在尝试理解浅层副本(参考文献)。
我创建了一个类,如果它已经存在,它应该生成一个实例的浅表副本,但是我的代码正在创建单独的实例。
这里的意图是,如果我尝试创建一个与现有对象具有相同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值创建的。
答案 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)