Python中list()构造函数与[]列表字面量的差异及报错疑问
先看问题里的两种写法:
第一种报错的代码:
some_string = input() string_list = list(*some_string) print(string_list)
第二种正常运行的代码:
some_string = input() string_list = [*some_string] print(string_list)
核心原因:*的作用场景与list()构造函数的参数要求不匹配
*some_string是对可迭代对象的解包操作
字符串属于可迭代对象,*some_string会把字符串里的每个字符拆成独立的参数。比如输入"abc",*some_string就等价于传入'a', 'b', 'c'三个独立参数。list()构造函数仅接受1个参数list()的正确用法是传入一个可迭代对象(比如list("abc")),它会把这个可迭代对象的元素转换为列表。但如果用list(*some_string),就相当于给list()传了多个参数(比如list('a','b','c')),这违反了list()的参数规则,会直接抛出TypeError: list() takes at most 1 argument (3 given)的错误。
只有当字符串长度为1时,*some_string解包后仅生成一个参数(比如list('a')),刚好符合list()的参数要求,所以能正常运行;长度≥2时都会报错,并非仅大于2的情况。[*some_string]是列表字面量的专属解包语法
这是Python专门设计的语法,*在这里的作用是把可迭代对象的所有元素直接“展开”到列表字面量中,相当于手动将每个字符逐个放入列表。不管字符串长度多少,这种写法都完全符合语法规则,因此始终能正常运行。
关于help(list())和help([])文档相同的说明
你查询的是列表实例的帮助文档,list()和[]创建的都是list类的实例,它们的实例方法自然完全一致。但我们遇到的问题是list()构造函数的调用规则,以及列表字面量的解包语法区别,这些内容不在实例的帮助文档范围内,所以查实例文档看不出两者差异。
内容的提问来源于stack exchange,提问作者CHANHYEOK KIM

