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

Nov*_*ice 9 python loops python-3.x semantics

我理解in运算符在此代码中的作用:

some_list = [1, 2, 3, 4, 5]
print(2 in some_list)
Run Code Online (Sandbox Code Playgroud)

我也明白i将在此代码中采用列表的每个值:

for i in [1, 2, 3, 4, 5]:
    print(i)
Run Code Online (Sandbox Code Playgroud)

我很好奇,如果in在使用的操作for循环是一样的in第一个代码使用运营商.

cxw*_*cxw 18

它们是相同的概念,但不是相同的运营商.

在该print(2 in some_list)示例中,in是一个处理几种不同情况的运算符.运算符Python文档in提供了详细信息:x in y调用y.__contains__(x)if是否y具有__contains__成员函数.否则,x in y尝试迭代y.__iter__()查找x,或调用y.__getitem__(x)if __iter__是否不存在.复杂性是为旧代码和更新代码提供一致的成员资格测试 - __contains__如果您正在实现自己的类,则是您想要的.

for循环中,in它只是一个标记,它将循环索引变量与循环中的任何变量分开.循环Python文档for讨论了语义:in在循环开始时评估后面的任何内容以提供迭代器.然后循环体为迭代器的每个元素运行(限制break或其他控制流更改).该for声明并不担心__contains____getitem__.

编辑 @Kelvin提出了一个很好的观点:你可以改变in你自己的新式类的行为(class foo(object)):

  • 赞成,因为您可以通过定义__contains__来改变第一种in的行为 (2认同)
  • @Novice这是一个非常容易理解的猜测:)。差异是微妙的,但却是真实的。例如,for循环不会调用__contains__。无论如何,祝您编程愉快! (2认同)