【问题标题】:I don't get how tuple unpacking works (Python-2.x) [duplicate]我不明白元组解包的工作原理(Python-2.x)[重复]
【发布时间】:2013-07-24 23:23:36
【问题描述】:

我想知道元组解包是如何工作的,我在几个线程上发现了这个答案作为切片的替代方法:

>>>>def unpack(first,*rest):
    return first, rest

其工作原理如下:

>>>>first,rest=unpack(*(1,2,3))
>>>>first
1
>>>>rest
(2,3)

我不明白 * 是如何工作的。参数“first”不应该提供给我的函数 unpack 吗?我认为 * 表示该参数是可选的。

感谢您的帮助

【问题讨论】:

  • 你在这里混合概念。 unpack() 的返回值被解包为firstrest(元组解包)。 unpack() 函数签名有一个 splat-syntax catch-all 参数rest。第三,您正在使用函数调用功能将序列扩展为位置参数。 这是三个不同的东西
  • 是的,我知道我使用的是函数调用功能。我不明白的是 unpack(*(1,2,3)) 相当于 unpack(1,2,3)

标签: python python-2.7 iterable-unpacking


【解决方案1】:

函数定义中的* 并不意味着可选;它的意思是“将调用者提供的任何其他(非关键字)参数打包到一个元组中,并将元组放在这里”。类似地,函数调用中的* 意味着“解包这一系列事物,并将所有元素作为参数单独提供给函数。”

unpack(*(1,2,3))

解压(1,2,3)并调用

unpack(1,2,3)

1 分配给first,其余参数23 打包成一个元组并分配给rest

【讨论】:

  • 这比上面的答案还要清楚!我没有意识到函数定义中的 * 和函数调用中的 * 之间存在区别。谢谢!
【解决方案2】:

在您的情况下,unpack(*(1,2,3)) 只是 unpack(1, 2, 3)

unpack 的实现采用第一个参数和一个 args 故事,然后将其作为元组返回。

星形语法很有用,如果您将参数作为变量传递:

a = (1, 2, 3)
first, rest = unpack(*a)

【讨论】:

  • 好的,我明白了,谢谢。我没有意识到这两个是等价的,第二个公式更清晰。
猜你喜欢
  • 2018-02-13
  • 2014-02-28
  • 2021-01-06
  • 2017-11-16
  • 2015-01-03
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
相关资源
最近更新 更多