
为甚么不能直接给不定长位置参数*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 表示拆包操作,如果不拆包直接传递元组本身的引用,就会报错 1 JeffGe 2022 年 1 月 15 日 via Android 你可以定义这个的 def sum(iterable): ... iterable 可以给任何可迭代对象 |
2 pursuer 2022 年 1 月 15 日 这是有语义上的差异的。函数可以接受不定长参数,你传一个元组,函数要如何区分你要把元组作为一个变长参数的第一个参数,还是要把元组拆成变参的参数? |
3 zhy0216 2022 年 1 月 15 日 因为 sum(1, 2, 3) 比 sum((1, 2, 3)) 好看些 |
4 StevenRCE0 2022 年 1 月 15 日 既然你都理解它的本质了,其实就已经知道为什么是这样的…… |
5 iPhone12 2022 年 1 月 15 日 2 楼正解,此帖终结。 |
7 weakish 2022 年 1 月 15 日 > 如果不拆包直接传递元组本身的引用,就会报错 就是语言为了实现上的简单性,没有做这个转换而已。 我不记得有没有语言会做这个转换的,只能强行举个无关的 `*` 号的例子。golang 里面 (*(*x).y).z 可以简写成 x.y.z (指针自动解引用)。 `sum(my_tuple)` 理论上也可以自动转成 `sum(*my_tuple)`,只是 Python 没有做而已。 |
8 pursuer 2022 年 1 月 15 日 @weakish 匹配和自动转换通常要语言有类型系统才行,类似 Java 和 C++的重载。Python 没类型系统,Type Hints 也是后面加的不能影响这种原先设计的语法,自动转换无法避开我上面提到的传参时的歧义。当然函数实现者还是可以通过 type(args[0])判断并做自动转换。 |
9 deplivesb 2022 年 1 月 16 日 二楼已解 |