Почему вложенный список был вложен на уровень глубже всего лишь с запятой в конце строки

#python-3.x

#python-3.x

Вопрос:

Я столкнулся со странной синтаксической проблемой в python 3.9.1 (могут быть и другие), и я не могу найти причину этого в документации или здесь. Мне просто любопытно, почему это произошло.

У меня есть функция, которая возвращает список:

 def func():
    return 1,2,3,4
 

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

 dict = {key1:[func()], key2: [func(), func()]}
 

план состоял в том, чтобы передать значения другой функции, которая выполняла бы итерацию по списку списка. Конечная функция будет работать независимо от того, что было во внешнем списке, 0, 1, много.

В моем коде мне пришлось обновить ключи перед вызовом рабочей функции.

 dict[key1] = [func()],  #<== final comma
 

Это была последняя запятая в присваивании значения, который является моим вопросом. Я скопировал часть инструкции построения словаря для этого ключа и оставил в запятой. Он создал список внутри списка внутри списка. Удаление запятой дало желаемый результат — список списков. Я просто не могу найти никакой документации о том, почему произошло такое поведение. Кто-нибудь может это объяснить?

Ответ №1:

Конечная запятая — это синтаксис для 1-го кортежа. Обычно это используется внутри круглых скобок:

 threetuple = (1, 2, 3)
twotuple = (1, 2)
onetuple = (1,)
literal = (1)   # evaluates to the integer 1, not to a tuple
 

но синтаксис python допускает это в любом блоке, где это не вызывает двусмысленности, в том числе за пределами круглых скобок:

 threetuple = 1, 2, 3
twotuple = 1, 2
onetuple = 1,
literal = 1
 

Это то, что происходит с вами — когда вы делаете

 dict[key1] = [func()],
 

вы назначаете один кортеж, который содержит одноэлементный список, который содержит func() .


Поместите конечную запятую внутри квадратных скобок, и все будет в порядке:

 dict[key1] = [func(),]
 

Это стандартный синтаксис списка, и он разрешен для любой длины списка или кортежа — это требуется только тогда, когда вы пишете литерал с одним кортежем, потому что в противном случае python не сможет узнать, что вы подразумеваете, что это один кортеж.

Комментарии:

1. Спасибо за четкое объяснение. Я, наконец, нашел ссылку в руководстве на запятую для одного кортежа (встроенные типы — кортежи), после трех дней поиска какого-либо намека на то, почему.