Замена значений Python в списке

#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. Я знаю, и я написал задание с увеличенным значением, чтобы он знал, какие операции с различиями он может выполнять