【问题标题】:Adding classes, preventing changing indexes from affecting data添加类,防止更改索引影响数据
【发布时间】:2015-04-29 00:49:58
【问题描述】:

我有一个 K() 类,它有一个 __add__() 方法,其工作原理如下

d_1 = K(dict(a=3, b=5), dict(b=45,c=23))
d_2 = K(dict(a='three',b='two'), dict(b='wa',c='wo'))
>>d = d_1 + d_2
>>d == K({'a': 3, 'b': 5}, {'b': 45, 'c': 23}, {'a': 'three', 'b': 'two'}, {'b': 'wa', 'c': 'wo'})
True

但是,如果我更改一些数据

d_1['c'] = 'apples'
d_2['c'] = 'oranges'

然后再次检查...

>>d == K({'a': 3, 'b': 5}, {'b': 45, 'c': 23}, {'a': 'three', 'b': 'two'}, {'b': 'wa', 'c': 'wo'})
False

变化的数据影响了原来的添加方式。我尝试使用 .copy() 来创建我们正在添加的变量的副本,并使用它们 - 但是我没有任何运气......

def __add__(self, other):
    scopy, ocopy = self.copy(),other.copy()
    slist,olist = [],[]
    for x in scopy.list_of_dictionaries_from_init:
        self_temp.append(x)
    for i in other_copy.list_of_dictionaries_from_init:
         temp.append(i)
    return K(*(self_copy.list_of_dictionaries_from_init + olist))

这完全行不通

我不确定如何使用副本进行这项工作

【问题讨论】:

    标签: python dictionary operator-overloading


    【解决方案1】:

    这里的问题是您的copy 方法可能只是使用相同的字典创建一个新列表。当您复制元素本身是可变集合的集合时,它们不会被复制。

    如果要“一直向下”复制,请使用deepcopy 函数。例如,您可以将自己的copy 方法更改为调用deepcopy。 (可能还有你的__init__ 方法。)

    例如,可能是这样的:

    def copy(self):
        return K(copy.deepcopy(self.list_of_dictionaries_from_init))
    

    同时,您的 add 方法没有任何意义。您创建了slistolist 列表,然后尝试追加到self_temptemp 列表,然后您尝试使用self_temp,就好像它是K 实例而不是列表一样。如果你有copy的方法,先定义__iadd__,然后根据它定义__add__可能会更简单:

    def __iadd__(self, other):
        self.list_of_dictionaries_from_init += other.list_of_dictionaries_from_init
    
    def __add__(self, other):
        self_copy = self.copy()
        self_copy += other
        return self_copy
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2021-12-17
      相关资源
      最近更新 更多