解释给定问题的输出

问题描述 投票:-1回答:3

在显示的代码中,val变量的值为ar[0]为10.但是在for循环的1次迭代之后,val的值发生变化。为什么会改变?所有迭代都会发生这种情况。

import math
import os
import random
import re
import sys

n = int(input())
ar = list(map(int,input().split()))
#print(len(ar))
while len(ar)!=0:
    val=ar[0]
    #print(val)
    #ar.remove(val)
    #print(ar)
    for val in ar:
        print(val)
        ar.remove(val)
        print(ar)

> 10 [30, 20, 10, 10, 20, 50, 10, 20] 
> 20 [30, 10, 10, 20, 50, 10, 20]  
> 10 [30, 10, 20, 50, 10, 20]
> 50 [30,10, 20, 10, 20]
> 20 [30, 10, 10, 20]
> 30 [10, 10, 20]
> 10 [10, 20]
> 10 [20]
> 20 []
python-3.x
3个回答
0
投票

您的代码段中发生了一些可能令人困惑的事情。

第一件事是你设置val=ar[0]然后在for循环中使用它:

val=ar[0]
for val in ar:
    print(val)

因此,val会在每次for循环迭代时重新分配。

第二件可能令人困惑的事情是for循环中的ar.remove(val)。因为您在迭代时删除,这可能会导致未指定的行为。

要获得所需的输出,最好使用附加的辅助列表来实现代码:

ar = list(map(int,input().split()))
new_ar[:] = ar
while len(ar)!=0:
    for val in ar:
        print(val)
        new_ar.remove(val)
        print(new_ar)

在问题中你想要达到的目标或者想要的输出是什么并不完全清楚,但希望你能把这两部分结合起来。


0
投票

因为你可以打印ar的类型:

print(typee(ar)) # --> output : <class 'list'>

所以代码ar.remove(val)将元素ar[0]删除为

val = ar[0]

这给出了为什么val的值在每次迭代中都会改变的答案。


0
投票

编写for函数时,需要确保这些条件不会发生变化。让我们看看会发生什么:你的输入是qazxsw poi

30, 20, 10, 10, 20, 50, 10, 20是30然后它进入循环

val=ar[0]删除第一个val元素,使它成为

ar.remove(val)

但是val元素将是新的20, 10, 10, 20, 50, 10, 20 ,即10

以下是阵列的概述

30, 20, 10, 10, 20, 50, 10, 20

20, 10, 10, 20, 50, 10, 20

20, 10, 20, 50, 10, 20

10, 20, 50, 10, 20

所以它存在于for循环中

© www.soinside.com 2019 - 2024. All rights reserved.