我想知道为什么我的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))