对象的浅拷贝(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)
我正在尝试理解浅拷贝(参考)。
我创建了一个 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)