Что и почему выведет код на Python? Оператор is
Что и почему выведет код на Python?
x = 1
y = 1
y = pow(10, 30, 10**30-1) # => 1
print(x, y, x is y) # => ???
Понимаю чем отличается is от ==, но все равно не могу понять причину, почему код выводит False. Думаю, что как-то связано с самим pow, но объяснить причину, почему y больше не ссылается на тот-же элемент в памяти, что и x не могу.
Ответы (2 шт):
интересный факт: Разница заключается в том, что is проверяет идентичность (объектов),его используют, чтобы удостовериться, что переменные указывают на один и тот же объект в памяти, а == проверяет равенство (значения).
Да, это ошибка в интерпретаторе cpython, потому что вообще-то питон всегда кэширует небольшие числа и они должны совпадать и по is тоже. Но в данном случае нашёлся небольшой глюк:
x_divremalways returns fresh ints, never cached small ints. This behavior is relied upon in thelong_true_dividefunction, as it mutates the returned quotient
То есть глюк этот находится в функции, которая берёт остаток от деления. Изменения по этому багу были внесены в код для версии питона 3.10, там этой проблемы уже не должно быть. Я пробовал на версии 3.11, там ваш код уже точно выдаёт True.