Dav*_*ave 1 python variables dictionary
第一篇文章,所以玩得好!
我有一个关于Python词典的相当基本的问题.我希望有一些dict值在另一个变量被更改时更新(或者至少在下次调用时重新计算) - 例如:
mass = 1.0
volume = 0.5
mydict = {'mass':mass,'volume':volume}
mydict['density'] = mydict['mass']/mydict['volume']
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,mydict ['density']只返回2.0.如果我改变mydict ['mass'] = 2.0,密度将不会更新.很好 - 我可以理解为什么 - 密度是由传递给声明时的值定义的.所以我想也许我可以用lambda表达式来解决这个问题,例如(为可怕的代码道歉!):
mydict['density_calc'] = lambda x,y: x/y
mydict['density'] = mydict['density_calc'](mydict['mass'],mydict['volume'])
Run Code Online (Sandbox Code Playgroud)
但同样,这只会返回原始密度,尽管改变了mydict ['mass'].作为最后的尝试,我尝试了这个:
def density(mass,volume): return mass/volume
mydict['density_calc'] = lambda x,y: density(x,y)
mydict['density'] = mydict['density_calc'](mydict['mass'],mydict['volume'])
Run Code Online (Sandbox Code Playgroud)
再一次,没有骰子.这似乎是一个非常简单的问题需要解决,所以提前道歉,但如果有人能帮助我,我会非常感激!
干杯,
戴夫
似乎是滥用字典结构.为什么不创建一个简单的类?
class Entity(object):
def __init__(self, mass, volume):
self.mass = mass
self.volume = volume
def _density(self):
return self.mass / self.volume
density = property(_density)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,最好为此创建一个类并使用动态属性.例如:
class Body(object):
def __init__(self):
self.mass=1.0
self.volume=0.5
@property
def density(self):
return self.mass/self.volume
这将为您提供质量,体积和密度属性,其中密度基于其他两个值计算.例如
b=Body()
b.mass=1
b.volume=0.5
print b.density # should be 2
b.mass=2.0
print b.density # should be 4
然而,如果你执着于使用字典你应该扩展它,并覆盖__getitem__和__setitem__"神奇"的方法来检测和质量时,已经改变了,否则当访问密度,并根据需要重新计算.