Цикл Python с использованием zip с присвоением

#python

#python

Вопрос:

Я пытаюсь использовать цикл for для изменения значений в списке на основе значений во втором списке. Следовательно, я думал, что функция «zip» пригодилась бы, однако я не получаю ожидаемого результата. Смотрите пример здесь:

 list_a = [0,0,0,0]
list_b = [1,2,3,4]

for a, b in zip(list_a, list_b):
a = b*2
  

Я думал, что это изменяет list_a, однако это не так. Насколько я понимаю, внутри цикла «a» сначала было равно list_a[0] , затем list_a[1] и т.д., Другими словами, представлениям списка.

На самом деле у меня есть 2 вопроса:

а) что такое «a» и «b» внутри цикла, если они не являются представлениями двух списков?

б) существует ли pythonic способ реализации этого цикла (т. Е. Что-то отличное от зацикливания i in range(len(list_a)) ?

Комментарии:

1. pythonic способ? вероятно, выполняйте свои операции с пониманием и создайте новый список, присвоив ему значение list_a в конце.

2. a=.. не изменяется a[0] . Он просто присваивает новое значение переменной. view это концепция numpy-массива, а не списка.

3.«сначала был равен list_a[0], затем list_a[1] и т.д., Другими словами, просмотр списка». Нет, они не являются представлениями. list_a[i] возвращает объект, содержащийся по этому индексу в списке. a = list_a[0] заставляет имя a ссылаться на некоторый объект, который является первым элементом list_a , но этот объект не знает об этом

4. Это просто еще одни ссылки, а не указатели.

Ответ №1:

Вы можете попробовать что-то вроде:

 list_a = [0,0,0,0]
list_b = [1,2,3,4]

for i, b in enumerate(list_b):
    list_a[i] = b*2
  

Вы можете получить тот же результат с:

 [b*2 for b in list_b]