This question has many answers already, but consider the function split into bytecode:
def f():
lie = 0
if lie is lie is lie:
print('Lie')
dis.dis(f)
2 0 LOAD_CONST 1 (0)
2 STORE_FAST 0 (lie)
3 4 LOAD_FAST 0 (lie)
6 LOAD_FAST 0 (lie)
8 DUP_TOP
10 ROT_THREE
12 COMPARE_OP 8 (is)
14 JUMP_IF_FALSE_OR_POP 22
16 LOAD_FAST 0 (lie)
18 COMPARE_OP 8 (is)
20 JUMP_FORWARD 4 (to 26)
>> 22 ROT_TWO
24 POP_TOP
>> 26 POP_JUMP_IF_FALSE 36
4 28 LOAD_GLOBAL 0 (print)
30 LOAD_CONST 2 ('Lie')
32 CALL_FUNCTION 1
34 POP_TOP
>> 36 LOAD_CONST 0 (None)
38 RETURN_VALUE
This suggests that all lie
s are being checked to see if they match, in a linear fashion. If one fails, it should break/return.
To confirm, consider:
>lie is lie is lie is lie is lie
True
>lie is not lie is lie is lie is lie is lie
False
>lie is lie is lie is lie is lie is not lie
False