【问题标题】:Dictionary value as function with parameter [duplicate]字典值作为带有参数的函数[重复]
【发布时间】:2021-08-27 12:13:03
【问题描述】:

我想做这样的事情(这是一个简单的例子,但它说明了问题):

a = {'a' : 3, 'b': (lambda x: x * 3)(a['a'])}

但我希望a['b'] 的值在a['a'] 更改时自动更新。

在这种情况下,a['b'] 当然只在开始时被评估,所以我得到了这个:

>>> a = {'a': 3, 'b': (lambda x: x * 3)(a['a'])}
>>> a
{'a': 3, 'b': 9}
>>> a['a'] = 4
>>> a
{'a': 4, 'b': 9}

我想要的是这个:

>>> a = {'a': 3, 'b':(lambda x: x * 3)(a['a'])}
>>> a
{'a': 3, 'b': 9}
>>> a['a'] = 4
>>> a
{'a': 4, 'b': 16}      <<<<<<<<<< change

有谁知道是否有一种简单/pythonic 的方法来实现这一点?

【问题讨论】:

  • 代码无法运行。因为a 尚未完成声明,而您正在引用a
  • 为此,您必须继承或编写字典并在__getitem__ 中实现此行为。
  • 你基本上想要一个 @property 作为一个 dict 项目,TL;DR,这实际上是不可能的。最接近和最简单的方法是编写一个类似 dict 的类。

标签: python


【解决方案1】:

如果在检索时调用该函数,则可以实现:

a = {'a': 3, 'b': (lambda: a['a']*3)}

a["b"]()
# 9

a["a"] = 5
a["b"]()
# 15

但肯定有更好的方法来处理此类行为。

【讨论】:

  • 这还不错,有趣的是,如果我在 a 的定义中添加 () 它无法更新。谢谢!
  • 关键是如果你在定义时已经调用它,那么就没有任何动态了(除了这在这里不起作用)。
猜你喜欢
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多