为什么 x,y = zip(*zip(a,b)) 在 Python 中有效?

83 投票
7 回答
42780 浏览
提问于 2025-04-15 20:49

我真的很喜欢Python的zip()函数,几乎每次都用,真是太棒了。不过有时候我想做zip()的反向操作,心里想“我以前知道怎么做的”,然后就去谷歌搜索python unzip,最后想起来原来是用这个神奇的*来解压一个被压缩的元组列表。就像这样:

x = [1,2,3]
y = [4,5,6]
zipped = zip(x,y)
unzipped_x, unzipped_y = zip(*zipped)
unzipped_x
    Out[30]: (1, 2, 3)
unzipped_y
    Out[31]: (4, 5, 6)

这到底是怎么回事?这个神奇的星号在干嘛?它还能用在其他地方吗?Python里还有哪些神秘又难以搜索的酷炫东西呢?

7 个回答

9

这对于多个参数也很有用:

def foo(*args):
  print args

foo(1, 2, 3) # (1, 2, 3)

# also legal
t = (1, 2, 3)
foo(*t) # (1, 2, 3)

而且,你可以使用两个星号来处理关键字参数和字典:

def foo(**kwargs):
   print kwargs

foo(a=1, b=2) # {'a': 1, 'b': 2}

# also legal
d = {"a": 1, "b": 2}
foo(**d) # {'a': 1, 'b': 2}

当然,你还可以把这些结合起来使用:

def foo(*args, **kwargs):
   print args, kwargs

foo(1, 2, a=3, b=4) # (1, 2) {'a': 3, 'b': 4}

这些功能真的很不错,也很实用。

18

星号(*)的作用类似于在Lisp和Scheme中所说的apply。简单来说,它会把你的列表里的内容拿出来,然后用这些内容作为参数来调用一个函数。

44

在Python的教程中,有关于星号(*)的说明,具体可以在解包参数列表这一部分找到。

撰写回答