我理解in
运算符在此代码中的作用:
some_list = [1, 2, 3, 4, 5]
print(2 in some_list)
我也明白i
将在此代码中对列表的每个值进行处理:
for i in [1, 2, 3, 4, 5]:
print(i)
我很好奇in
循环中使用的for
运算符与第一个代码中使用的in
运算符相同。
答案 0 :(得分:16)
它们是相同的概念,但不是相同的运算符。
在print(2 in some_list)
示例中,in
是一个处理多种不同情况的运算符。 Python docs for the in
operator提供了详细信息,我将其解释如下:如果x in y
具有y.__contains__(x)
成员函数,则y
调用__contains__
。否则,x in y
会尝试遍历y.__iter__()
以查找x
,或在y.__getitem__(x)
不存在的情况下调用__iter__
。复杂性是为旧代码和更新代码提供一致的成员资格测试 - 如果您正在实施自己的类,__contains__
就是您想要的。
在for
循环中,in
只是一个标记,用于将循环索引变量与您循环的任何循环分开。 Python docs for the for
loop讨论语义,我将其解释如下:在循环开始时评估in
之后的任何内容以提供迭代器。然后循环体为迭代器的每个元素运行(限制break
或其他控制流更改)。 for
语句并不担心__contains__
或__getitem__
。
编辑 @Kelvin提出了一个很好的观点:您可以根据自己的新式课程in
更改class foo(object)
的行为:
x in y
,define y.__contains__()
。 for x in y
,define y.__iter__()
。答案 1 :(得分:0)
不,它不一样。第一个示例中的in
测试是对成员资格的测试并返回真值。此in
可能会被视为==
或is
的顺序模拟(取决于__contains__
的实施方式)。
第二个例子中的in
是迭代语法的一部分;它会暂时将您选择的变量i
绑定到iterable中的每个项目。这个in
可能被认为是赋值运算符=
的顺序模拟。
答案 2 :(得分:0)