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