如何解决python类属性引用有副作用吗?
我对代码中的错误感到困惑:
使用方法distribute_tags
class ConsulData:
def __init__(self,logger,marshalled_data,prom_numbering,prom_count):
self.logger = logger
self.current = marshalled_data
self.to_update= {}
self.payloads = []
self.prom_count = prom_count
self.prom_numbering = prom_numbering
def distribute_tags(self):
cpt = 0
cp_current = copy.deepcopy(self.current)
for keys,values in cp_current.items():
num = (cpt % self.prom_count) + self.prom_numbering
prometheus_tag = "prometheus-{}".format(num)
if not prometheus_tag in values['Tags']:
self.to_update[keys] = values
data = []
[data.append(v) for v in values['Tags'] if not v.startswith("prometheus")]
data.append(prometheus_tag)
self.to_update[keys]['Tags'] = data
cpt += 1
{...}
没有深度复制,循环执行后,print(self.current == self.to_update)
返回True
。
然后print(id(self.current) == id(self.to_update))
返回False。
使用deepcopy
修复了我无法预料的错误,因为distribute_tags
内的操作与执行以下操作大致相同:
In [2]: d1 = {'key1':'value1','key2':'value2'}
In [3]: d2 = {}
In [4]: for k,v in d1.items():
...: d2[k] = v
In [6]: d2['key1'] = 'lol'
In [8]: d1
Out[8]: {'key1': 'value1','key2': 'value2'}
In [9]: d2
Out[9]: {'key1': 'lol','key2': 'value2'}
其中d1数据不受d2修改的影响,因为它们是对不同对象的2个不同引用。
传递给 init 函数的marshalled_data看起来像这样:
payload = {
'service1': {
'ID': 'service1','Service': 'service1','Tags': ['sre-metrics','prometheus-2'],'Meta': {
'env': 'dev','namespace': 'test','path': '/path1','svc': 'svc1','team': 'testing'},'Port': 80,'Address': 'test1.testing.org','Weights': {'Passing': 1,'Warning': 1},'EnableTagOverride': False
},...
解决方法
如果您不进行深拷贝,
self.to_update[keys] = values
分配对同一values
词典的引用。以后再做
self.to_update[keys]['Tags'] = data
您正在修改该词典,因此两个值仍然相等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。