При переназначении ссылки на Python на себя, он отменяет назначение и переназначает или ничего не делает? - PullRequest
0 голосов
/ 27 марта 2019
def new_val(x):
    x['a'] = 5
    return x

b = {'a': 2}
b = new_val(b) # b re-assigned to ret val

Поскольку словари являются изменяемыми, b является ссылочным указателем на словарь, и мы передаем этот указатель в функцию new_val.

Ссылка на словарь не изменяется, но ссылка на 2 словаря меняется на 5.

Исходная переменная b теперь должна иметь «a» для отображения на 5. Однако мне интересно, изменяется ли когда-либо ссылка на словарь (другими словами, указатель на переменную b).

Технически, мы «переназначаем» ссылочную переменную b на ссылку, которая оказывается одинаковой.

Что происходит на низком уровне? Похоже ли это на запрет, когда какая-то логика распознает, что ссылка одна и та же, или ссылка действительно не назначена и не переназначена?

Возможно, более простой пример будет:

b = {}
b = b # At a low level, what does this line do?

1 Ответ

2 голосов
/ 27 марта 2019

b = b - это , а не . Данные, хранящиеся в предыдущей переменной b, переназначаются новой переменной, имя которой также b. Так что он ничего не делает, но не игнорируется.

Не верь мне на слово. Вместо этого давайте разберем ваш последний пример:

def f():
    b = {}
    b = b

import dis

print(dis.dis(f))

  2           0 BUILD_MAP                0
              3 STORE_FAST               0 (b)

  3           6 LOAD_FAST                0 (b)
              9 STORE_FAST               0 (b)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE

Как видите, для этой строки b = b есть 2 операции LOAD_FAST и STORE_FAST на b. Они не достигают ничего полезного, но они выполнены.

...