#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. Пожалуйста, отформатируйте свой код в своем ответе, чтобы его было легче читать.