Вот простой способ отличить два списка (независимо от содержимого), вы можете получить результат, как показано ниже:
>>> from sets import Set
>>>
>>> l1 = ['xvda', False, 'xvdbb', 12, 'xvdbc']
>>> l2 = ['xvda', 'xvdbb', 'xvdbc', 'xvdbd', None]
>>>
>>> Set(l1).symmetric_difference(Set(l2))
Set([False, 'xvdbd', None, 12])
Надеюсь, это поможет.
Это потому, что эти значения считаются равными:
>>> True == 1
True
>>>
>>> False == 0
True
и имеют одинаковые хэш-значения:
>>> hash(True), hash(1)
(1, 1)
>>>
>>> hash(False), hash(0)
(0, 0)
Следовательно, из точки зрения словаря True
и 1
неразличимы, как False
и 0
.
Невозможно «отключить» это - вы не должны использовать неоднородные ключи в dict, чтобы начать с .
Потенциальным обходным путем в этом конкретном случае было бы зарезервировать специальные значения int для True
и False
, отличных от 1
и 0
, соответственно (предполагая, что вам нужны 1
и 0
в качестве независимых ключей). Например, вы могли бы -1
представлять True
и -2
представлять False
.
bool
является подклассом int
, представление является «False» или «True», но значение равно 0 или 1.
Просто предлагаю некоторый фон на ответе аршаджи.
Два булевых значения True
и False
имеют странное отношение с целыми числами.
С одной стороны, они имеют разные строковые представления и имеют отдельные тождества:
>>> print(True)
True
>>> print(1)
1
>>> True is 1
False
С другой стороны, они ведут себя как целые числа при сравнении и арифметике:
>>> True == 1
True
>>> True + 1
2
Причиной такого поведения является совместимость. Давным-давно, тип bool
не существовал. «Булевы» операторы скопировали поведение С, повторно использовали 0
и 1
для «false» и «true».
В конце концов Guido реализовал , это не имело большого смысла и добавил константы, которые мы знаем и любим.
Но была проблема. Даже тогда было уже много кода, который обрабатывал логические значения, такие как целые числа. Если логические операции начали использовать «правильный» тип, весь этот код сломался.
Итак, Гвидо сделал компромисс. Булевы имеют свой собственный тип bool
и отличаются друг от друга целыми числами. Но в арифметических операциях и сравнениях, особенно __eq__
и __hash__
, они рассматриваются как одно и то же. Таким образом, старый код будет продолжать работать, в то время как новый код все еще может использовать новый тип bool
.
Возможно, это изменится на Python 4. Но пока bool
является подклассом int
, и нам придется жить с этим.
(В отношении связанной заметки это одна из причин, почему True
и False
указаны в заголовке, а не в нижнем регистре, например другие ключевые слова Python.)
False is 0
были бы True
. Я понимаю, что вы имеете в виду, но просто для ясности ...
– Aerovistae
8 November 2013 в 06:03