代码之家  ›  专栏  ›  技术社区  ›  MarkS

对象(类实例)的浅层副本

  •  1
  • MarkS  · 技术社区  · 7 年前

    我试图理解浅薄的副本(参考文献)。

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

    这里的目的是,如果我试图创建一个与现有对象具有相同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值创建的。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jake    7 年前

    你正在创建 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)