Python 'in' 表达式中的关键字与 for 循环中的关键字
Python 'in' keyword in expression vs. in for loop
我了解 in
运算符在这段代码中的作用:
some_list = [1, 2, 3, 4, 5]
print(2 in some_list)
我也明白 i
将采用此代码中列表的每个值:
for i in [1, 2, 3, 4, 5]:
print(i)
我很好奇 for
循环中使用的 in
运算符是否与第一个代码中使用的 in
运算符相同。
不,不一样。第一个示例中的 in
测试是成员资格测试,returns 是真值测试。 in
可能被认为是 ==
或 is
的顺序模拟(取决于 __contains__
的实现方式)。
第二个例子中的in
是迭代语法的一部分;它暂时将您选择的变量 i
绑定到可迭代对象中的每个项目。 in
可能被认为是赋值运算符 =
的顺序类似物。
它们是相同的概念,但不是相同的运算符。
在print(2 in some_list)
示例中,in
是一个处理多种不同情况的运算符。 Python docs for the in
operator 给出了详细信息,我将其解释如下:如果 y
具有 __contains__
成员函数,则 x in y
调用 y.__contains__(x)
。否则,x in y
会尝试遍历 y.__iter__()
以找到 x
,或者如果 __iter__
不存在则调用 y.__getitem__(x)
。复杂性在于为旧代码和新代码提供一致的成员资格测试 — 如果您要实现自己的 类.
,__contains__
就是您想要的
在 for
循环中,in
只是一个标记,用于将循环索引变量与您正在循环的任何内容分开。 Python docs for the for
loop 讨论语义,我解释如下:在循环开始时评估 in
之后的任何内容以提供迭代器。然后循环体针对迭代器的每个元素运行(除非 break
或其他控制流更改)。 for
语句不用担心 __contains__
或 __getitem__
.
Edit @Kelvin 提出了一个很好的观点:您可以根据自己的新样式 类 更改 in
的行为(class foo(object)
):
- 改变
x in y
,define y.__contains__()
。
- 改变
for x in y
,define y.__iter__()
.
不,虽然他们都使用同一个词,但他们做的事情却不同。 in
在这两种情况下都是语法结构,例如它不是对象的名称,不能更改。你可以看到here and here每一个的句法定义。如您所见,名称是硬编码的,没有任何关系。
我了解 in
运算符在这段代码中的作用:
some_list = [1, 2, 3, 4, 5]
print(2 in some_list)
我也明白 i
将采用此代码中列表的每个值:
for i in [1, 2, 3, 4, 5]:
print(i)
我很好奇 for
循环中使用的 in
运算符是否与第一个代码中使用的 in
运算符相同。
不,不一样。第一个示例中的 in
测试是成员资格测试,returns 是真值测试。 in
可能被认为是 ==
或 is
的顺序模拟(取决于 __contains__
的实现方式)。
第二个例子中的in
是迭代语法的一部分;它暂时将您选择的变量 i
绑定到可迭代对象中的每个项目。 in
可能被认为是赋值运算符 =
的顺序类似物。
它们是相同的概念,但不是相同的运算符。
在print(2 in some_list)
示例中,in
是一个处理多种不同情况的运算符。 Python docs for the in
operator 给出了详细信息,我将其解释如下:如果 y
具有 __contains__
成员函数,则 x in y
调用 y.__contains__(x)
。否则,x in y
会尝试遍历 y.__iter__()
以找到 x
,或者如果 __iter__
不存在则调用 y.__getitem__(x)
。复杂性在于为旧代码和新代码提供一致的成员资格测试 — 如果您要实现自己的 类.
__contains__
就是您想要的
在 for
循环中,in
只是一个标记,用于将循环索引变量与您正在循环的任何内容分开。 Python docs for the for
loop 讨论语义,我解释如下:在循环开始时评估 in
之后的任何内容以提供迭代器。然后循环体针对迭代器的每个元素运行(除非 break
或其他控制流更改)。 for
语句不用担心 __contains__
或 __getitem__
.
Edit @Kelvin 提出了一个很好的观点:您可以根据自己的新样式 类 更改 in
的行为(class foo(object)
):
- 改变
x in y
,definey.__contains__()
。 - 改变
for x in y
,definey.__iter__()
.
不,虽然他们都使用同一个词,但他们做的事情却不同。 in
在这两种情况下都是语法结构,例如它不是对象的名称,不能更改。你可以看到here and here每一个的句法定义。如您所见,名称是硬编码的,没有任何关系。