Как заставить две записи каталога всегда относиться к тому же значению плавающему

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

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

1
задан Björn Pollex 6 July 2010 в 18:03
поделиться

2 ответа

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

>>> 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
ответ дан 2 September 2019 в 23:14
поделиться

Более простой способ создать своего рода указатель в 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
ответ дан 2 September 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: