Python:在循环运行时更改循环参数

-3 投票
3 回答
3154 浏览
提问于 2025-04-17 06: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

3 个回答

0

问题在于,这个赋值操作

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
0

如果你在代码中的一些关键地方打印出 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 值开始一个新的循环。

3

你需要把问题说得更清楚,因为没有解释你是怎么从输入 [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 的文档来看:

在循环中修改正在迭代的序列是不安全的(这只会发生在可变序列类型,比如列表)。如果你需要修改正在迭代的列表(例如,复制选中的项目),你必须对它的一个副本进行迭代。

补充:如果根据评论你是想遍历网址,那你需要更复杂的逻辑来进行深度优先或广度优先的遍历,而不仅仅是用一个列表(顶层链接)替换另一个列表(第一页的链接)。在你的例子中,一旦进入第一页,你就完全失去了对第二页和第三页的跟踪。

撰写回答