Разница между arr [index] и вызовом переменной, равной arr [index] - PullRequest
0 голосов
/ 26 апреля 2018

Этот вопрос касается того, рассматривает ли python свои «имена» как указатели или ссылки, которым я пока не нашел четкого объяснения.

Рассмотрим следующий сценарий:

L = [[][]]
L1 = L[1]
L1 = [1] # Interested in what happens after this line
print L # L = [[], []]

Тем не менее, если мы изменим указанную выше интересующую строку на L [1] = [1], а именно на блок кода ниже:

L = [[][]]
L1 = L[1]
L[1] = [1] # Interested in what happens after this line
print L # L = [[], [1]]

Приведенные выше кодовые блоки отличаются только третьей строкой, где мы используем L [1] (непосредственно индексируя массив) или L1 (переменную, которую мы присвоили как L1 = L [1]).

Так что же такое L1 и L [1] по сути? Какая разница? Один из них справочный, а другой нет?

Спасибо за устранение этой путаницы!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

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

 >> L = [[],[]]
 >> L1 = L[1]
 >> L1.append(1)
 >> L[1].append(2)
 L1: [1, 2]
 L: [[], [1, 2]]

В исходном примере вы переопределяли копии, выполняя новые назначения для новых списков. Надеюсь, это поможет!

0 голосов
/ 26 апреля 2018

L1 = b сохраняет b в переменной L1. Так что L1 = L[1] и L1 = [1] просто меняют то, на что указывает L1. Второму заданию не важно, что было в L1 раньше.

L[a] = b по существу эквивалентно L.__setitem__(a, b). Так что, несмотря на то, что это похоже на присваивание переменных, это совершенно другое. Нет имени / переменной / указателя / ссылки L[1].

Кроме того, во втором блоке кода L1 = L[1] не имеет никакого эффекта. Вы можете удалить его, и результат будет таким же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...