Как я могу использовать 1 и True как в качестве словарного ключа [duplicate]

Вот простой способ отличить два списка (независимо от содержимого), вы можете получить результат, как показано ниже:

>>> 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])

Надеюсь, это поможет.

9
задан Aerovistae 8 November 2013 в 05:56
поделиться

3 ответа

Это потому, что эти значения считаются равными:

>>> 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.

6
ответ дан arshajii 22 August 2018 в 21:03
поделиться

bool является подклассом int, представление является «False» или «True», но значение равно 0 или 1.

1
ответ дан Ignacio Vazquez-Abrams 22 August 2018 в 21:03
поделиться
  • 1
    есть больше, чем просто значение. Он также имеет ту же функцию хэширования. – mgilson 8 November 2013 в 06:07

Просто предлагаю некоторый фон на ответе аршаджи.

Два булевых значения 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.)

6
ответ дан Lambda Fairy 22 August 2018 в 21:03
поделиться
  • 1
    Они не являются псевдонимами ... если бы они были, False is 0 были бы True. Я понимаю, что вы имеете в виду, но просто для ясности ... – Aerovistae 8 November 2013 в 06:03
  • 2
    Отредактировано и исправлено. Это то, что происходит, когда вы StackOverflow прямо перед отъездом на работу;) – Lambda Fairy 8 November 2013 в 09:06
Другие вопросы по тегам:

Похожие вопросы: