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