【问题标题】:Python: Change the parameter of the loop while the loop is runningPython:在循环运行时更改循环的参数
【发布时间】:2011-11-12 11:32:10
【问题描述】:

我想将 for 循环中的 a 更改为 [4,5,6]。 这段代码只打印:1, 2, 3

a = [1,2,3]

for i in a:
    global a
    a = [4,5,6]
    print i

我想要输出 1, 4, 5, 6

【问题讨论】:

  • 真正的用例是什么(而不是这个玩具问题)?
  • 有了新的编辑,它比以前更没有意义了......
  • @kame - 您是否尝试递归站点中的所有链接?
  • 你应该使用 python 列表。并执行循环,直到列表为空。当您访问链接时,将其从列表中删除。
  • 所以你不需要回溯?只需点击一个接一个的链接?

标签: python for-loop


【解决方案1】:

您需要澄清这个问题,因为没有说明当您的输入为 [1, 2, 3] 时您应该如何得出所需的输出 1, 4, 5, 6。以下产生了所需的输出,但它完全是临时的,没有任何意义:

i = 0
a = [1, 2, 3]
while i < len(a):
    print(a[i])
    if a[i] == 1:
        a = [4, 5, 6]
        i = 0          # edit - good catch larsmans
    else:
        i += 1

主要的一点是你不能在循环执行时修改for循环的参数。来自python文档:

在循环中修改被迭代的序列是不安全的 (这只会发生在可变序列类型上,例如列表)。如果 您需要修改您正在迭代的列表(例如, 复制所选项目)您必须遍历副本。

编辑:如果基于您尝试遍历 URL 的 cmets,您需要更复杂的逻辑来执行深度优先或广度优先遍历,而不仅仅是将一个列表(顶级链接)替换为另一个列表(链接在第一页)。在您的示例中,您在进入第 1 页后完全忘记了第 2 页和第 3 页。

【讨论】:

  • 在重置列表变量a 时,您需要重置i=0。否则,+1,因为这似乎反映了 OP 的实际问题,如 cmets 中所述。
【解决方案2】:

问题在于分配

a = [4,5,6]

只改变变量a,而不是底层对象。有多种方法可以解决这个问题;一种是使用类似的while循环

a = [1,2,3]

i = 0
while i<len(a):
    print a[i]
    a = [4,5,6]
    i += 1

打印

1
5
6

【讨论】:

    【解决方案3】:

    如果您在代码中有用的地方打印 id(a),您就会明白为什么这不起作用。

    即使这样也行不通:

    a = [1,2,3]
    
    def change_a(new_val):
        a = new_val
    
    for i in a:
        change_a([4,5,6])
        print i
    

    我认为不可能做你想做的事。跳出当前循环并使用新的 a 值开始一个新循环。

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      相关资源
      最近更新 更多