Python' in'表达式与for循环中的关键字

时间:2016-07-05 13:09:55

标签: python loops python-3.x semantics

我理解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运算符相同。

3 个答案:

答案 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)的行为:

答案 1 :(得分:0)

不,它不一样。第一个示例中的in测试是对成员资格的测试并返回真值。此in可能会被视为==is的顺序模拟(取决于__contains__的实施方式)。

第二个例子中的in是迭代语法的一部分;它会暂时将您选择的变量i绑定到iterable中的每个项目。这个in可能被认为是赋值运算符=的顺序模拟。

答案 2 :(得分:0)

不,虽然他们都使用相同的词,但他们做了不同的事情。 in在两种情况下都是语法结构,例如它不是对象的名称,不能更改。您可以看到herehere每个句法的语法定义。正如您所看到的,名称是硬编码的并且没有关系。