Python:在字典中将变量链接/绑定在一起

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)

再一次,没有骰子.这似乎是一个非常简单的问题需要解决,所以提前道歉,但如果有人能帮助我,我会非常感激!

干杯,

戴夫

Fog*_*ird 9

似乎是滥用字典结构.为什么不创建一个简单的类?

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)


Joh*_*ery 6

在这种情况下,最好为此创建一个类并使用动态属性.例如:


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__"神奇"的方法来检测和质量时,已经改变了,否则当访问密度,并根据需要重新计算.