如何使用可变长度序列的序列拆包?

How to use sequence unpacking with a sequence of variable length?

如果我事先知道列表的长度,我可以使用序列拆包来为变量分配列表的元素:

my_list = [1,2,3]

x, y, z = my_list

如果我事先不知道列表的长度,如何使用序列拆包将变量分配给列表的元素?如果为了争论我不关心变量是如何命名的,我可以先得到列表的长度然后解压到这么多任意命名的变量吗?

正确答案是您应该将这些元素放在一个列表中。这就是列表的用途。

错误的答案是迂回添加局部变量。对于 Python 3:

ctr = 0
for value in my_list:
    __builtins__.locals()['my_list_{}'.format(ctr)] = value
    ctr += 1

如果 my_listn 项,这将创建变量 my_list_0, my_list_1, ..., my_list_{n-1}

请不要这样做。

你可以像这样强制将列表的长度解包到你想要的大小

>>> my_list=range(10)
>>> a,b,c = my_list[:3]
>>> a
0
>>> b
1
>>> c
2
>>> my_list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 

如果它们小于你会得到一个错误,否则你取前 3 个元素

对于元素较少的情况你可以这样做

>>> my_list=[1,2]
>>> x,y,z=(my_list[:3] +[-1]*3)[:3]
>>> x
1
>>> y
2
>>> z
-1
>>> 

有一个包含默认值的列表,您可以将其连接到 my_list 的 sub-list,然后从结果中获取您需要的内容

当然推荐但可能:

my_list = [1, 2, 3]
for counter, value in enumerate(my_list):
    exec 'a{} = {}'.format(counter, value)
print a0, a1, a2

输出:

1 2 3

或使用Python 3:

>>> a, *rest = my_list
>>> a
1
>>> rest
[2, 3]