为什么python不通过迭代替换列表的新值?



我想知道为什么我的for循环不更新old_hosts值,为什么在下面的代码中更新工人?我没有给工人变量分配任何新值!!

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]]

因为在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]]

您的代码基本正确。您必须将值赋给要更改的列表元素,而不是变量。如果old_hosts包含不在workers中的工作id,您的解决方案将中断。我删除了多余的生成器表达式。

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]]
print('old_hosts: ' + str(old_hosts))

检查最后一行,改为

print('old_hosts: ' + str(old_host))

最新更新