Что означает "(1,) == 1", в Python?

Я тестирую структуру кортежа, и мне было странно, когда я использую оператор ==, например:

>>>  (1,) == 1,
Out: (False,)

Когда я присваиваю эти два выражения переменной, результат верен:

>>> a = (1,)
>>> b = 1,
>>> a==b
Out: True

Эти вопросы отличаются от правила синтаксиса кортежей для кортежей Python на мой взгляд. Я задаю группу выражений между оператором ==.

Ответ 1

Другие ответы уже показали вам, что поведение связано с приоритетом оператора, как это описано здесь.

Я собираюсь показать вам, как найти ответ самостоятельно в следующий раз, когда у вас возникнет вопрос, похожий на этот вопрос. Вы можете деконструировать, как выражение анализирует использование модуля ast:

>>> import ast
>>> source_code = '(1,) == 1,'
>>> print(ast.dump(ast.parse(source_code), annotate_fields=False))
Module([Expr(Tuple([Compare(Tuple([Num(1)], Load()), [Eq()], [Num(1)])], Load()))])

Из этого видно, что код анализируется, как объяснил Тим Петерс:

Module([Expr(
    Tuple([
        Compare(
            Tuple([Num(1)], Load()), 
            [Eq()], 
            [Num(1)]
        )
    ], Load())
)])

Ответ 2

Это просто приоритет оператора. Ваш первый

(1,) == 1,

такие группы:

((1,) == 1),

поэтому строит кортеж с одним элементом из результата сравнения одноэлементного кортежа 1, с целым числом 1 для равенства. Они не равны, поэтому вы получаете 1-кортеж False, для результат.

Ответ 3

Когда вы делаете

>>> (1,) == 1,

он строит кортеж с результатом сравнения кортежа (1,) с целым числом и, таким образом, возвращает False.

Вместо этого, когда вы назначаете переменные, два одинаковых кортежа сравниваются друг с другом.

Вы можете попробовать:

>>> x = 1,
>>> x
(1,)