Я пытаюсь объединить два кортежа, используя перегруженный + оператор в Python 3.6. У меня нет проблемы, если я включу круглую скобку, как первый пример, но если я опустил скобки, как во втором примере, я получаю сообщение об ошибке. Сообщение, которое я получаю, это "плохой тип операнда для унарного +:" кортеж ". Может ли кто-нибудь объяснить, что происходит?
newtup = (3,) + (2,4)
newtup = 3, + (2,4)
Унарный оператор +
ожидает действительный операнд (int, float и т.д.) С правой стороны.
В коде 3, + (2, 4)
вы предоставляете кортеж (2, 4)
в качестве операнда +
который не является допустимым операндом, а также является ошибкой.
В вашем коде:
newtup = (3,) + (2, 4)
Это 2 отдельных набора (3,)
и (2,4)
, поэтому он работает.
newtup = 3, + (2, 4)
Вот его один кортеж с 2 элементами 3
и +(2, 4)
который не удается из-за вышеупомянутой причины.
Это вопрос приоритета. 3, + (2, 4)
анализируется как кортеж с элементами 3
и +(2, 4)
, а не как добавление 3,
и (2, 4)
. Вам нужны скобки.
Он пытается проанализировать вторую строку как
(3, + (2,4))
Затем, видя, что вы использовали унарный +
, как в a = +5
, с кортежем. Это недопустимо, и вы получаете ошибку. Запятые имеют очень широкий приоритет (т.е. они потребляют как можно больше символов, ближе к +, чем a *). Причина этого заключается в том, что (biglongexpression1
, biglongexpression2
) никогда не должно смешивать две biglongexpression
. Все остальное более важно и должно быть оценено перед запятой, и, следовательно, +(2,4)
оценивается перед запятой - потому что это большая biglongexpression
.
Как вы это делаете:
3, + (2,4)
Это в основном упрощает до двух частей 3,
и +(2,4)
, второе недопустимо, поэтому вы можете попробовать новую распаковку в python 3:
(3,*(2,4))
Если на python2 просто используйте второй пример.
Просто; На первой строке вы создаете новый кортеж из 2 кортежей. Во второй строке вы добавляете int в кортеж. Проверь это.
x, y=3, (2,4) # assign x and y to 3, and (2,4) respectively
print type(y), type(x)
<type 'tuple'> <type 'int'>