神秘的for循环在python中

时间:2014-08-29 17:56:45

标签: python for-loop sequence contains membership

exp = [1,2,3,4,5]

如果我执行x in exp,它会给我False。但是如果我执行:

for x in exp:
    if x==3:
        print('True')

然后执行x in exp,它返回True。这里发生了什么?我没有给x分配任何东西。我有吗?我真的很困惑。

**编辑:**对不起,如果我之前没有这样说:x之前没有定义。

答案

谢谢大家。我现在明白了。 exp的元素被分配给x,因为exp被迭代。并且x in exp在最后一行代码中等于True,因为最后一个元素已分配给x

5 个答案:

答案 0 :(得分:16)

好像你在Python中有点过载in时发现了。

  • 使用x in exp,您要问的是x exp?"
  • 使用for x in exp: ...,您告诉Python" exp中的每个元素,将其称为x并执行操作..."

后者会将exp中的每个值一个接一个地分配给x,并使用该值执行循环体,因此在第一次迭代中x已在第二个1和最后一个2中分配5。此外,x 在循环后保留此值!

因此,在循环之前,假设变量x已定义但具有其他值,x in exp将返回False,并在循环之后返回True },因为x仍然分配了exp的最后一个值。

答案 1 :(得分:7)

for x in ...固有地将值分配给x,因为xa for loop中的循环变量。

循环的每次迭代都会将值赋给x; Python不会为循环创建新的变量范围。

for x in (1, 2, 3):
    foo(x)

相当于......

x = 1
foo(x)
x = 2
foo(x)
x = 3
foo(x)

答案 2 :(得分:2)

语法类似,但它们意味着两种不同的东西。

x in exp是条件表达式;它搜索以查看值 x列在exp列表中。如果它在那里,表达式 评估为True,否则为False。您也可以使用not in

for x in exp引入了一个循环,其中x遍历元素 exp。循环体将为每个元素和内部调用一次 身体,x将连续设置到每个元素。

答案 3 :(得分:1)

循环在Python中是如何工作的。 ' For var in sequence'在迭代序列时将分配给var

如果您只是打印x,例如:

for x in [1, 2, 3, 4, 5]:
    print x

您会看到以下内容:

1
2
3
4
5

也许您所寻找的只是价值的指数?如果是这样,你可以做几件事。

要使用索引显式迭代,请使用enumerate(sequence)

for index, x in enumerate(mylist):
    if index == 3:
        do_stuff()

第一个值(在这种情况下为index)始终是当前迭代的索引。

您还可以使用range(len(sequence))遍历对象的长度,如果您在迭代时可能会修改列表,这有时很有用。在这里,您实际使用range创建单独的列表,其长度等于列表的len。这将从您定位的列表中进行分配 - 而不是从range()创建的列表中进行分配 - 因此您必须使用for x in...作为列表的索引。

for x in range(len(mylist)):
    if mylist[x] == 3:
        things_and_stuff()

关于你的第二行和混淆点 - ' x in exp' - 您确实会看到x在事后仍然分配,因此使用x in exp将返回True,因为x的最后一次分配值实际上是{ {1}}。

exp

答案 4 :(得分:1)

当您运行第一个循环时,在迭代它时,会为列表的每个值分配变量x

我们假设您从x=0开始。

0中的

[1,2,3,4,5] 不是,因此x in exp = False

但是,当您运行循环时,您现在有了一个新的x。循环完成后,x将初始化为列表中的最后一个元素,即x=5

5中的

[1,2,3,4,5] ,因此x in exp = True