Как сделать, чтобы две записи в каталоге всегда ссылались на одно и то же значение с плавающей точкой - PullRequest
1 голос
/ 06 июля 2010

Учтите это:

>>> 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 ]

1 голос
/ 06 июля 2010

Это возможно только с изменяемыми объектами, поэтому вы должны обернуть ваше неизменное значение в некоторый изменяемый объект. Фактически любой изменяемый объект будет делать, например, встроенный список:

>>> 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}

Работает так же хорошо;)

1 голос
/ 06 июля 2010

Самый простой способ иметь в 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]}

Работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...