Список параметров Python с одним аргументом

При тестировании списка параметров Python с одним аргументом я обнаружил странное поведение print,

>>> def hi(*x):
...     print(x)
...
>>> hi()
()
>>> hi(1,2)
(1, 2)
>>> hi(1)
(1,)

Может ли кто-нибудь объяснить мне, что означает последняя запятая в hi(1)результат (то есть (1,))

1 ответ

Решение

На самом деле поведение только немного "странно".:-)

Ваш параметр x имеет префикс со звездочкой, что означает, что все аргументы, которые вы передаете функции, будут "свернуты" в один кортеж, и x будет этот кортеж

Значение (1,) это способ, которым Python пишет кортеж из одного значения, чтобы противопоставить его (1), который будет номером 1.

Вот более общий случай:

def f(x, *y):
    return "x is {} and y is {}".format(x, y)

Вот несколько прогонов:

>>> f(1)
'x is 1 and y is ()'
>>> f(1, 2)
'x is 1 and y is (2,)'   
>>> f(1, 2, 3)
'x is 1 and y is (2, 3)'
>>> f(1, 2, 3, 4)
'x is 1 and y is (2, 3, 4)'

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

Другие вопросы по тегам