>>> 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
Комментариев нет:
Отправить комментарий