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

2024-09-28 22:13:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道为什么我的for循环没有更新旧的_hosts值,为什么要在下面的代码中更新worker?我没有给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]]

Tags: 代码inhostforifoldw1worker
3条回答
print('old_hosts: ' + str(old_hosts))

勾选最后一行,改为

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

你的代码几乎是正确的。必须指定给要更改的列表元素,而不是变量。如果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]]

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

相关问题 更多 >