首页 > 解决方案 > 为什么嵌套列表嵌套更深,行尾只有一个逗号

问题描述

我在 python 3.9.1 中遇到了一个奇怪的语法问题(可能是其他问题),我在文档或此处找不到原因。我只是好奇为什么会这样。

我有一个返回列表的函数:

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

我正在创建一个字典键以供以后使用,并且我希望该值是一个嵌套列表:

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

计划是将值传递给另一个函数,该函数将遍历列表。最终函数可以工作在外部列表中的任何内容,0、1、许多。

在我的代码中,我必须在调用工作函数之前更新密钥。

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

这是我的问题的价值分配中的最后一个逗号。我已经复制了该键的字典构建语句部分,并留在了逗号中。它在列表中的列表中创建了列表。删除逗号得到所需的结果列表列表。我只是找不到任何关于为什么会发生这种行为的文档。谁能解释一下?

标签: python-3.x

解决方案


尾随逗号是 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 无法知道您的意思是单元组。


推荐阅读