【问题标题】:Why python does not replace the new value of a list by iteration?为什么python不通过迭代替换列表的新值?
【发布时间】:2021-11-02 20:00:39
【问题描述】:

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

【问题讨论】:

  • 请不要在发布有效答案后将您的问题编辑到其他主题。您可以随时发布新问题。
  • 回答您的新问题:old_host 是循环中workers 列表中对当前工作人员的引用。当您更改 old_host 中的元素时,您正在更改原始列表。
  • 谢谢。我怎样才能将它们彼此分离,所以如果 old_host 从工人那里获得价值的副本?

标签: python list iteration


【解决方案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]]

【讨论】:

  • 谢谢,刚刚我编辑了这个问题,并问为什么工人的价值会改变?
  • @MohammadSadeghAslanpour 欢迎。这个问题正在被其他人关闭。也许这最好问另一个问题。如果这是正确的,请阅读此链接:meta.stackexchange.com/questions/5234/…
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    print('old_hosts: ' + str(old_hosts))
    

    检查最后一行,更改为

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

    【讨论】:

    • 请在您的答案中格式化您的代码,以便于阅读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多