Обновите ссылку на значение dict вместо обновления значения dict - PullRequest
0 голосов
/ 09 мая 2019

Я понимаю, почему ниже работает так:

v = 1
d = dict()
d['hi'] = v
d['hi'] = 2
print(v)  # prints 1 as expected

А также почему это работает:

class Node:
  def __init__(self,val):
    self.val = val


n = Node(1)
d['hi_node'] = n
d['hi_node'].val = 100
print(n.val)  # prints 100 as expected

Я также считаю , что я понимаю, почему ниже работает так:

n2 = Node(2)
d['hi_n2'] = n2
n3 = Node(3)
val_in_d = d['hi_n2']  # creates a new binding of name val_in_d
val_in_d = Node(3) # updates the location to which val_in_d points
print(n2.val) # still 2

Но есть ли способ указать n2 на n3, используя словарь d, который имеет такое же влияние, как и написание n2 = n3? Итак, наконец, если я печатаю n2.val, я получаю 3, т.е. я хочу взять значение, хранящееся в словаре, и изменить его ссылку, чтобы указывать на другой объект, а не просто обновлять значение, хранящееся в словаре.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 09 мая 2019

Проблема в том, что вы не изменили значение указателя, вы изменили сам указатель.

n2 = Node(2)
d['hi_n2'] = n2
n3 = Node(3)
val_in_d = d['hi_n2']  # Here you get the pointer that points at n2
val_in_d = Node(3) # By assigning val_in_d to the Node constructor result you change the pointer
print(n2.val) # still 2

Вместо этого вы должны использовать фактическое значение, например:

n2 = Node(2)
d['hi_n2'] = n2
n3 = Node(3)
val_in_d = d['hi_n2'] # Get pointer
val_in_d.val = 3 # Change value in the object,
print(n2.val) # Prints 3

В качестве альтернативы вы можете создать класс / оболочку среднего уровня, чтобы Python не мог изменить требуемый указатель, например Назначение ссылки на переменную Python .

...