Как сделать, чтобы две записи в каталоге всегда ссылались на одно и то же значение с плавающей точкой

1

Рассмотрим это:

>>> 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. Есть ли способ, который проще, чем создание пользовательского класса для хранения значения?

Теги:
dictionary
reference
immutability

2 ответа

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}

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

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

Работает!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню