Python中print(*args)的星号作用是什么?为何不会触发异常?
问题原理说明
这里涉及Python中*操作符的两种不同合法用法,因此代码不会抛出异常:
- 函数定义时的
*是打包操作符:你在定义duplication_test(*args: str)时,*的作用是把调用函数时传入的所有零散位置参数,打包成一个元组赋值给args变量,这也是你明确知道args是元组类型的原因。 - 函数调用时的
*是解包操作符:你写print(*args)时,*的作用是把后面紧跟的可迭代对象(这里就是args元组)拆成多个独立的位置参数,传入被调用的函数中。
Python内置的print函数本身就支持接收任意数量的位置参数,它的签名为print(*objects, sep=' ', end='\n', ...),刚好适配你解包后传入的多个字符串参数。比如当args为('babe', 'I', 'love', 'you')时,print(*args)完全等价于print('babe', 'I', 'love', 'you'),print会默认用空格分隔多个输入参数,因此你会得到空格隔开的单词输出,而非元组的字符串形式。
你原本计划编写的print(args)也属于合法写法,只是逻辑是把整个元组作为单个参数传给print,输出的就是元组的标准表示格式,也就是带括号和引号的结果,两种写法都没有语法错误,只是实际运行效果不同。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

