让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
。
答案 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
,因为x
是a 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
。