Как сделать ссылку на определенный ключ / значения диктовать? - PullRequest
0 голосов
/ 05 октября 2018

Мне интересно, возможно ли сделать ссылку на конкретный ключ dict.

Например, если я создаю dict:

D={0:[1,2,3],1:['a','b','c']}

и ссылкув список 0

ref_D_0=D[0]

Я могу напечатать значение клавиши 0 D dict

print(ref_D_0)
# [1, 2, 3]

, но если я изменю D dict:

D[0]=[3,2,1]
print(D) # {0: [3, 2, 1], 1: ['a', 'b', 'c']}

затем ref_D_0 по-прежнему дает мне предыдущее значение D [0]

print(ref_D_0) 
#[1, 2, 3]

Я ожидаю, что ref_D_0 ссылается на D [0] вместо того, чтобы сделать его копию.Неужели я что-то не так понял в ссылках на python?

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Когда вы пишете ref_D_0=D[0], значение ref_D_0 использует dict для поиска своего текущего значения (список [1,2,3]).После этого не имеет связи с диктовкой, только со значением его 0 ключа.Если вы измените этот список * (например, D[0][1] = 5), значение ref_D_0 также изменится.Тем не менее, вы неВместо этого вы присваиваете новое значение .То, что вы делаете, по сути эквивалентно

a = [1,2,3]
b = a # they point to the same list
a = [3,2,1] # they don't anymore

Таким образом, чтобы подвести итог, вы не поняли неправильно.ref_D_0 относится к объекту, находящемуся в данный момент в D[0], это не копия.Однако, если этот объект заменен (не изменен ), ваш ref_D_0 все еще ссылается на исходный объект.

Единственный способ сделать то, что вы хотите, это иметь указатель на D[0], но в python такого нет.

0 голосов
/ 05 октября 2018

ref_D_0 относится к определенному объекту.

D[0] относится к тому же объекту.

D[0] = [3, 2, 1] создает новый объект и заставляет D[0] ссылаться на него, заменяяисходный объект.

Конечно, это не влияет на ref_D_0.Зачем это нужно?

Если вы хотите изменить список вместо его замены в словаре, вы можете append, insert или даже назначить слайсу, например D[0][:] = [3, 2, 1].Это повлияет на ref_D_0, так как они все еще ссылаются на один и тот же объект.

0 голосов
/ 05 октября 2018

Когда вы делаете ref_D_0=D[0], вы заставляете переменную ref_D_0 ссылаться на тот же объект, который в настоящее время хранится в D[0].

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

D[0]=[3,2,1]

Теперь D[0] и ref_D_0 не ссылаются на один и тот же объект, потому что вы просто задали D[0] для ссылки на что-то еще.

Если вы измените объект, а не просто переназначите переменную, например,

D[0].append(0)

Тогда вы сможете увидеть изменения, отраженные в ref_D_0, потому что тогда две переменные все равно будутссылаются на тот же объект.

...