Почему python не заменяет новое значение списка итерацией?

#python #list #iteration

Вопрос:

Мне интересно, почему мой цикл for не обновляет значения old_hosts и почему обновляет рабочих в следующем коде? Я НЕ присваиваю никакого нового значения переменной workers!!!

 workers = [['w1', 1],['w2',2]]
old_hosts = [['w1',-1],['w1',-11]]

for old_host in old_hosts:
    old_host = [*(worker for worker in workers if worker[0]==old_host[0])][0]
    old_host[1]= 3
    print('old_host: '   str(old_host))
print('workers: '   str(workers))
print('old_hosts: '   str(old_hosts))
 

выход:

 old_host: ['w1', 1]
old_host: ['w1', 1]
workers: [['w1', 3], ['w2', 2]]
old_hosts: [['w1', -1], ['w1', -11]]
 

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

1. Пожалуйста, не редактируйте свой вопрос в другую тему после того, как были опубликованы правильные ответы. Вы всегда можете задать новый вопрос.

2. Чтобы ответить на ваш новый вопрос: old_host является ли ссылка на текущего работника из workers списка в вашем цикле. Когда вы меняете элемент, old_host вы меняете исходный список.

3. Спасибо. как я могу отделить их друг от друга, чтобы, если old_host получит копию значения от рабочих?

Ответ №1:

потому что в for-loop вы создаете локальную переменную и присваиваете свой массив локальной переменной, и вы old_hots вообще ничего не меняете.

Для изменения вашего массива вам нужно index и назначить этому индексу то, что вы хотите. для этой цели я использую enumerate , как показано ниже:

 workers = [['w1', 1],['w2',2]]
old_hosts = [['w1',-1],['w1',-11]]

for idx , old_host in enumerate(old_hosts):
    old_hosts[idx] = [*(worker for worker in workers if worker[0]==old_host[0])][0]
print('workers: '   str(workers))
print('old_hosts: '   str(old_hosts))
 

Выход:

 workers: [['w1', 1], ['w2', 2]]
old_hosts: [['w1', 1], ['w1', 1]]
 

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

1. спасибо, просто я отредактировал вопрос и спрашиваю, почему изменилась ценность работников?

2. @MohammadSadeghAslanpour добро пожаловать. этот вопрос закрывается другим. может быть, лучше задать другой вопрос. если это правильно, пожалуйста, прочтите эту ссылку : meta.stackexchange.com/questions/5234/…

Ответ №2:

Ваш код был почти правильным. Вы должны назначить элементу списка, который вы хотите изменить, а не переменную. Ваше решение сломается, если old_hosts содержит идентификатор работника, которого нет workers . Я удалил выражение избыточного генератора.

 workers = [['w1', 1],['w2',2]]
old_hosts = [['w1',-1],['w1',-11]]

for old_host in old_hosts:
    old_host[1] = [worker[1] for worker in workers if worker[0]==old_host[0]][0]
    print('old_host: '   str(old_host))
print('workers: '   str(workers))
print('old_hosts: '   str(old_hosts))
 

Выход

 old_host: ['w1', 1]
old_host: ['w1', 1]
workers: [['w1', 1], ['w2', 2]]
old_hosts: [['w1', 1], ['w1', 1]]
 

Ответ №3:

 print('old_hosts: '   str(old_hosts))
 

проверьте эту последнюю строку, измените на

 print('old_hosts: '   str(old_host))
 

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

1. Пожалуйста, отформатируйте свой код в своем ответе, чтобы его было легче читать.