Мы начинаем экспериментальную рубрику, в которой приглашённые эксперты будут делиться тонкостями различных языков.
Сегодня мы позвали Антона Репушко — автора курсов «Мидл Python-разработчик» и «Асинхронное программирование на Python».
Антон поделился примерами кода, которые иллюстрируют неочевидные особенности поведения Python.
📌 Генераторы и runtime
array = [1, 8, 15]
g = (x for x in array if array.count(x) > 0)
array = [2, 8, 22]
>>> print(list(g))
[8]
В выражении генератора предложение in вычисляется во время инициализации, но выражение с условием вычисляется только во время выполнения.
Таким образом, перед выполнением массив переназначается в список [2, 8, 22], и поскольку из 1, 8 и 15 только число 8 встречается больше 0 раз, генератор выдает только 8.
📌 Разница между is и =
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 257; b = 257
>>> a is b
True
Оператор is проверяет, относятся ли оба операнда к одному и тому же объекту.
Оператор == сравнивает значения обоих операндов и проверяет, совпадают ли они.
То есть is нужно использовать для ссылочного равенства, а == для равенства значений.
Пример, чтобы прояснить ситуацию:
>>> [] == []
True
>>> [] is [] # These are two empty lists at two different memory locations.
False
📌 Быть или не быть (is (not...) или is not)
>>> 'something' is not None
True
>>> 'something' is (not None)
False
is not — это отдельный оператор и его поведение отличается от случая, когда is и not чем-то разделены.
is not вычисляется в False только в случае, когда переменные по разные стороны оператора указывают на один и тот же объект.
Во всех остальных случаях выражение будет True.
👍 Поделитесь обратной связью в комментариях: интересно ли вам узнавать об особенностях языков? О каких языках хотелось бы узнать больше?
