#python #list
#python #Список
Вопрос:
Я, должно быть, совершаю глупую ошибку, но я действительно понятия не имею, почему это работает таким образом. Может ли кто-нибудь объяснить это мне, пожалуйста?
placement = [0]*4
for image in placement:
image = 1
print(placement)
вывод: [0, 0, 0, 0]
Комментарии:
1.
for image in placement
присваивает каждый элементplacement
переменнойimage
. Переназначениеimage
не влияет на исходный список.2. Это заменит числа в размещении, и вы можете утверждать, что я создаю новую переменную «e»:
placement = [1 for e in placement]
3. Нет, этого не произойдет.
placement = [1 for e in placement]
заменяет, повторно привязывает имяplacement
к новому списку , который создается путем взятия каждого элемента в исходном списке, привязки каждого элемента по порядку к имениe
и генерации из него нового значения, в частности, здесь, значения, которое полностью игнорируетсяe
(буквальное значение1
). Сгенерированные значения собираются в новый список, который привязывается к имениplacement
, но это не изменяет содержимое исходного списка , и вы можете это проверить:placement = [0] * 4; original = placement; placement = [1 for e in placement]; print(original)
4. У вас ошибочные представления о том, как работает присваивание в Python. Читать nedbatchelder.com/text/names.html .
5. Теперь я понимаю, спасибо!
Ответ №1:
Когда вы говорите:
image = 1
Вы только изменяете значение вызываемой переменной image
; другими словами, вы привязываете имя image
к новому значению. Это вообще не влияет на исходный список.
Более подробно: когда вы говорите for image in placement
, что происходит, так это то, что на каждой итерации for
цикла — имя image
привязывается к значению в соответствующей позиции в списке. Повторное присвоение ему только повторно привязывает его к какому-либо другому значению.
Приведенный for
выше цикл эквивалентен:
image = placement[0]
image = 1 # does not change placement[0]
image = placement[1]
image = 1 # does not change placement[1]
image = placement[2]
image = 1 # does not change placement[2]
image = placement[3]
image = 1 # does not change placement[3]
Чтобы изменить элементы в списке, вы можете назначить определенный индекс:
for i in range(len(placement)):
placement[i] = 1 # assigns into a specific position in the list, changing its contents
Ответ №2:
При итерации с for in
массивом, если изменение результирующего элемента с каждой итерации не повлияет на исходный массив. Используется enumerate
для итерации по массиву с индексом и присваивания с индексом
for index, image in enumerate(placement):
placement[index] = image 1
Комментарии:
1. Или в этом случае используйте выделенный оператор
placement[index] = 1
, но, пожалуйста, обратите внимание, что OP никогда не упоминал увеличение исходного значения, просто новое присвоение.2. Я знаю, и я написал задание с увеличенным значением, чтобы он знал, какие операции с различиями он может выполнять