Почему кортеж с одним элементом интерпретируется как этот элемент в python?

Может ли кто-нибудь объяснить, почему кортеж из одного элемента интерпретируется как этот элемент в Python?

А также

Почему бы им просто не напечатать кортеж (1,) как (1)?

См. примеры ниже:

>>> (1)
1
>>> ((((1))))
1
>>> print(1,)
1
>>> print((1,))
(1,)

person transang    schedule 20.11.2016    source источник
comment
Может ли кто-нибудь объяснить мне, почему одноэлементный кортеж интерпретируется как этот элемент Python? Это не так.   -  person Ry-♦    schedule 21.11.2016
comment
Вернитесь к своему переводчику и сделайте это x = (1), а затем сделайте type(x).   -  person idjaw    schedule 21.11.2016


Ответы (6)


Кортеж из одного элемента никогда не рассматривается как содержащийся элемент. Скобки в основном полезны для группировки, а не для создания кортежей; запятая делает это.

Почему они просто не печатают (1,) как (1)?

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

Документы для __repr__ дают некоторую ясность по этому поводу:

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

Отвечая на ваш вопрос, (1) - это просто целое число 1 с группирующей скобкой. Чтобы воссоздать одноэлементный кортеж через его представление, он должен быть напечатан как (1,), что является допустимым синтаксисом для создания кортежа.

>>> t = '(1,)'
>>> i = '(1)'
>>> eval(t)
(1,) # tuple
>>> eval(i)
1    # int
person Moses Koledoye    schedule 20.11.2016
comment
Я думал, что это не более чем КОНВЕНЦИЯ. воссоздать через его представление очень полезно - person transang; 21.11.2016

Потому что только (1, ) в ваших примерах является кортежем. Остальное - выражения.

In [4]: type(1,)
Out[4]: int

In [5]: type((1,))
Out[5]: tuple

In [6]: type((1))
Out[6]: int
person sardok    schedule 20.11.2016

Это потому, что (1) не является кортежем. (1) это 1 с круглыми скобками. Как говорится в документации python

именно запятая, а не круглые скобки, определяет кортеж.

Источник

Единственный кортеж без запятой — это 0-кортеж, то есть (). Обратите внимание: вы можете проверить это, запустив type((1)) и увидев, что он возвращает <type 'int'>, а не <type 'tuple'>.

person Eli Sadoff    schedule 20.11.2016

Это очень подробный ответ от @Ray Total.

Конечно, в общем случае скобки не меняют смысла выражения. Например, вы можете сказать 4+(1), и это будет 5, точно так же, как 4*(2-1) будет 4. Поскольку принято использовать круглые скобки для группировки подвыражений, разработчик Python подумал, что это будет слишком запутанно, чтобы перегружать смысл, чтобы означать как группировку, так и одноэлементные кортежи. Также в Python есть функция типа. На самом деле type((2)) — это int, а type((2,)) — это кортеж. Мы не хотим, чтобы была какая-то двусмысленность, которая была бы, если бы (2) рассматривалось как кортеж

person transang    schedule 20.11.2016

Кортеж состоит из ряда значений, разделенных запятыми (круглые скобки не обязательны).

Вы даже можете определить такой кортеж

t = 1,    # (with or without surrounding parentheses)
>>> type(t)
<class 'tuple'>

Здесь , используется для указания интерпретатору создать кортеж, если он отсутствует, он будет считаться int.

То же правило применяется, когда мы определяем так

>>> t = (1) 
>>> type(t)
<class 'int'>
person Shravan Uppin    schedule 01.07.2021

(1) - это не кортеж, это просто скобки вокруг числа. Это связано с тем, что иногда вы хотите использовать круглые скобки для указания порядка операций, например: (x+y)*z. Очевидно, это не относится к кортежу, содержащему x+y, а просто показывает, что сложение должно происходить до умножения.

(((1))) не является кортежем по той же причине, круглые скобки просто говорят: «оцените, что внутри, прежде чем двигаться дальше».

print(1,) просто вызывает функцию печати по номеру 1. При вызове функции разрешена запятая в конце. Однако в python2 это, вероятно, вызовет (1,), потому что print не является функцией.

print((1,)) — это единственное, что выводит кортеж, потому что теперь мы фактически передаем кортеж в функцию.

person Christopher Shroba    schedule 20.11.2016