понедельник, 1 июля 2019 г.

ЛМНты Python, 6 - 10

>>> is [not]

Недавно мы сравнивали id объектов, чтобы показать, что булевы значения True, полученные разными способами, представлены одним и тем же объектом:

>>> id(1 == 1) == id(True)
True
>>> id(bool(1)) == id(not False)
True

Чтобы проверить, что за двумя значениями или именами стоит один и тот же объект, в Python имеется оператор is (который, на самом деле, сравнивает id двух объектов).

>>> (1 == 1) is True
True
>>> bool(1) is (not False)
True

В отличие от is, оператор is not проверяет, что операнды указывают на разные объекты. Как и с операторами сравнений, с операторами is и is not можно строить цепочки:

>>> 'hi' is 'h'+'i' is not b'hi'
True

>>> Присваивание – это именование

Операция присваивания в Python связывает с именем слева от знака = объект, стоящий справа от него:

>>> a = [1, 2, 3]
>>> b = a
>>> a is b
True

Имена a и b оказались связаны с одним и тем же объектом, созданным из литерала [1, 2, 3]. Это значит, что имена работают как ссылки на объект.

Вообще, все идентификаторы в Python – имена переменных, функций, классов, модулей – работают как ссылки на объекты. Присваивание вида имя2 = имя1 приводит к тому, что имя2 начинает указывать на тот же объект, на который указывает имя1.

Примеры:

>>> import math
>>> pi2 = math.pi
>>> math.pi is pi2
True
>>> cos2 = math.cos
>>> math.cos is cos2
True
>>> math2 = math
>>> math is math2
True

>>> Цепочка присваиваний

В Python можно выполнить цепочку присваиваний. Например,

>>> a = b = c = []
>>> a is b is c
True

В результате все три переменные a, b и c указывают на один и тот же объект, созданный списочным литералом []. Обратите внимание, как это отличается от результата следующего фрагмента:

>>> a = []
>>> b = []
>>> c = []
>>> a is b is c
False

Теперь три переменные указывают на три разных пустых списка. В Python одинаковые литералы изменяемых объектов создают разные объекты с одинаковыми значениями. В отличие от одинаковых литералов неизменяемых объектов, где результат зависит от реализации.

>>> Пустое ложно

Чтобы проверить, что строка пуста, достаточно проверить ее на истинность/ложность в логическом контексте:

>>> if '':
...     print('Empty means True')
... else:
...     print('Empty means False')
...
Empty means False

Это относится не только к строкам, но и к другим последовательностям, словарям и множествам. Убедимся, что пустые строки, строки байтов, списки, кортежи, словари и множества работают как False:

>>> (
...     ''
...     or b''
...     or []
...     or ()
...     or {}
...     or set()
...     or False
... )
False
>>>
>>> any(('', b'', [], {}, (), set(), False))
False

>>> Ложь по умолчанию

При создании экземпляров встроенных классов с помощью конструкторов без аргументов, новые объекты неявно инициализируются значениями по умолчанию:

>>> bool()
False
>>> int()
0
>>> float()
0.0
>>> str()    # empty string
''
>>> list()   # empty list
[]
>>> tuple()  # empty tuple
()
>>> dict()   # empty dict
{}
>>> set()    # empty set
set()
>>> frozenset()
frozenset()

Эти начальные значения по умолчанию при тестировании на истинность/ложность оказываются ложными:

>>> (
...     bool()
...     or int()
...     or float()
...     or str()
...     or list()
...     or tuple()
...     or dict()
...     or set()
...     or frozenset()
...     or False
... )
False

Комментариев нет:

Отправить комментарий