gpt4 book ai didi

python - 添加类,防止更改索引影响数据

转载 作者:太空宇宙 更新时间:2023-11-03 17:45:05 29 4
gpt4 key购买 nike

我有一个类 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))

这根本行不通

我不知道如何使用副本来完成这项工作

最佳答案

这里的问题是您的 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

关于python - 添加类,防止更改索引影响数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29932474/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com