为甚么不能直接给不定长位置参数*args 传递一个元组类型的实参呢??

2022-01-15 10:40:25 +08:00
 AnnanAngel

为甚么不能直接给不定长位置参数*args 传递一个元组类型的实参呢??,它的本质不就是一个元组类型的形参嘛,为什么不能直接传递一个元组,反而还要进行拆包操作,才能传递

def sum(*args):
    sum = 0
    for num in args:
        sum = sum + num
    print('sum', sum, sep='=')


my_tuple = (1, 2, 3, 4)


sum(*my_tuple)
#*my_tuple 表示拆包操作,如果不拆包直接传递元组本身的引用,就会报错
2591 次点击
所在节点    Python
9 条回复
JeffGe
2022-01-15 10:50:36 +08:00
你可以定义这个的
def sum(iterable): ...

iterable 可以给任何可迭代对象
pursuer
2022-01-15 11:00:14 +08:00
这是有语义上的差异的。函数可以接受不定长参数,你传一个元组,函数要如何区分你要把元组作为一个变长参数的第一个参数,还是要把元组拆成变参的参数?
zhy0216
2022-01-15 11:07:57 +08:00
因为 sum(1, 2, 3) 比 sum((1, 2, 3)) 好看些
StevenRCE0
2022-01-15 11:58:42 +08:00
既然你都理解它的本质了,其实就已经知道为什么是这样的……
iPhone12
2022-01-15 13:27:15 +08:00
2 楼正解,此帖终结。
weakish
2022-01-15 16:23:08 +08:00
@pursuer 可以匹配呀,就看语言设计的取舍了,愿不愿意做复杂的解析逻辑。
weakish
2022-01-15 16:31:09 +08:00
> 如果不拆包直接传递元组本身的引用,就会报错

就是语言为了实现上的简单性,没有做这个转换而已。
我不记得有没有语言会做这个转换的,只能强行举个无关的 `*` 号的例子。golang 里面 (*(*x).y).z 可以简写成 x.y.z (指针自动解引用)。 `sum(my_tuple)` 理论上也可以自动转成 `sum(*my_tuple)`,只是 Python 没有做而已。
pursuer
2022-01-15 16:42:57 +08:00
@weakish 匹配和自动转换通常要语言有类型系统才行,类似 Java 和 C++的重载。Python 没类型系统,Type Hints 也是后面加的不能影响这种原先设计的语法,自动转换无法避开我上面提到的传参时的歧义。当然函数实现者还是可以通过 type(args[0])判断并做自动转换。
deplivesb
2022-01-16 15:11:40 +08:00
二楼已解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/828389

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX