如何使两个目录条目始终引用相同的float-value

时间:2010-07-06 18:03:53

标签: python dictionary reference immutability

考虑一下:

>>> foo = {}
>>> foo[1] = 1.0
>>> foo[2] = foo[1]
>>> foo
{1: 0.0, 2: 0.0}
>>> foo[1] += 1.0
{1: 1.0, 2: 0.0}

这就是发生的事情。但是,我想要的是最后一行:

 {1: 1.0, 2: 1.0}

这意味着两者都引用相同的值,即使该值发生变化。我知道上面的方法是这样的,因为数字在Python中是不可变的。有没有比创建自定义类来存储值更容易的方法?

2 个答案:

答案 0 :(得分:1)

在python中使用一种指针的更简单方法是将值打包到列表中。

>>> foo = {}
>>> foo[1] = [1.0]
>>> foo[2] = foo[1]

>>> foo
{1: [1.0], 2: [1.0]}

>>> foo[1][0]+=100 # note the [0] to write in the list

>>> foo
{1: [101.0], 2: [101.0]}

工作!

答案 1 :(得分:1)

只有可变对象才有可能,因此您必须使用某些可变对象包装不可变值。事实上,任何可变对象都可以,例如内置列表:

>>> n = [0]
>>> d = { 1 : n, 2 : n }
>>> d
{1: [0], 2: [0]}
>>> d[1][0] = 3
>>> d
{1: [3], 2: [3]}

但是创建自己的类或对象有什么用呢?

>>> n = type( "number", ( object, ), { "val" : 0, "__repr__" : lambda self: str(self.val) } )()
>>> d = { 1 : n, 2 : n }
>>> d
{1: 0, 2: 0}
>>> d[1].val = 9
>>> d
{1: 9, 2: 9}

效果一样好;)