问题
I understand what the in
operator does in this code:
some_list = [1, 2, 3, 4, 5]
print(2 in some_list)
I also do understand that i
will take on each value of the list in this code:
for i in [1, 2, 3, 4, 5]:
print(i)
I am curious if the in
operator used in the for
loop is the same as the in
operator used in the first code.
回答1:
They are the same concept but not the same operators.
In the print(2 in some_list)
example, in
is an operator that handles several different situations. The Python docs for the in operator give the details, which I paraphrase as follows: x in y
calls y.__contains__(x)
if y
has a __contains__
member function. Otherwise, x in y
tries iterating through y.__iter__()
to find x
, or calls y.__getitem__(x)
if __iter__
doesn't exist. The complexity is to provide consistent membership testing for older code as well as newer code — __contains__
is what you want if you're implementing your own classes.
In the for
loop, in
is just a marker that separates the loop-index variable from whatever you're looping over. The Python docs for the for loop discuss the semantics, which I paraphrase as follows: whatever comes after in
is evaluated at the beginning of a loop to provide an iterator. The loop body then runs for each element of the iterator (barring break
or other control-flow changes). The for
statement doesn't worry about __contains__
or __getitem__
.
Edit @Kelvin makes a good point: you can change the behaviour of in
with respect to your own new-style classes (class foo(object)
):
- To change
x in y
, define y.__contains__(). - To change
for x in y
, define y.__iter__().
回答2:
No, it is not the same. The in
test like in your first example is a test for membership and returns a truth value. This in
might be thought of as the sequential analogue of ==
or is
(depending on how __contains__
is implemented).
The in
in your second example is part of the iteration grammar; it temporarily binds your selected variable i
to each item in the iterable. This in
might be thought of as the sequential analogue of =
, the assignment operator.
回答3:
No, although they both use the same word they do different things. in
is in both cases a syntax structure, e.g. it is not a name of a object and can't be changed. You can see here and here the syntactic definition of each one. As you can see the names are hardcoded and have no relationship.
来源:https://stackoverflow.com/questions/38204342/python-in-keyword-in-expression-vs-in-for-loop