如何在两个对象之间建立实时连接

2024-10-01 09:37:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我声明了两个变量。首先是一本字典。第二个是列表(它是dictionary的'.values()'方法的输出)。你知道吗

dictVar={'one':1,'two':2,'three':3}
listVar=dictVar.values()

此时,listVar的内容准确地表示字典dictVar中存储的每个值 稍后,在代码的某个地方,字典将更新为一个新值:

dictVar['four']=4

现在listVar的内容是“过时的”。它并不代表字典中存储的所有值。 为了保持列表更新,我必须手动附加一个新值,例如:

dictVar['four']=4
listVar.append(4)

我想知道是否有办法在list变量和dictionary之间建立一个“实时”更新。所以每次字典被修改时,列表也会被更新。你知道吗


Tags: 方法代码声明内容列表dictionary字典one
2条回答

您可以做的事情是创建一个自定义类作为字典的包装器。无论何时调用obj[key] = val,都是隐式调用该对象的__setitem__(self, key, val)方法。创建自定义类时,可以覆盖此方法以执行您喜欢的操作(即,更新关联列表)。你知道吗

下面是一个示例类包装器:

class EnhancedDict(object):

  def __init__(self):               # The constructor
    self.dictVar = {}           # Your dictionary
    self.listVar = []           # Your list

  def __getitem__(self, key):   # Equivalent to obj[key]
    return self.dictVar[key]

  def __setitem__(self, key, val) # Equivalent to obj[key] = val
    self.dictVar[key] = val
    self.listvar.append(val)

然后,每当您向词典中添加新项时,列表将自动更新,您可以轻松地执行以下操作:

>>> dict_obj = EnhancedDict()
>>> dict_obj["foo"] = "bar"     # Automatically updates both the list and the dict
>>> dict_obj["foo"]
'bar'
>>> dict_obj.dictVar
{'foo': 'bar'}
>>> dict_obj.listVar
['bar']

还有一个__delitem__函数可以重写以完成类的功能。更多信息可在文档中找到:

https://docs.python.org/2/reference/datamodel.html

使用dictionary view object

>>> dictVar={'one':1,'two':2,'three':3}
>>> listVar=dictVar.viewvalues()
>>> listVar
dict_values([3, 2, 1])
>>> dictVar['one']=100
>>> listVar
dict_values([3, 2, 100])
>>> dictVar['four']=4
>>> listVar
dict_values([4, 3, 2, 100])
>>> list(listVar)==dictVar.values()
True

相关问题 更多 >