python中关于*和**操作符在函数内传参时应用的原理解析

*运算符适用于元组或者列表型变量,**运算符适用于字典型变量。本文主要解释在进行函数传参的时候这两者的应用方式及原理。

*运算符:

(1)当作为函数的形参的时候

list=('Hello','World')
def fun(*args):
    for i in args:
        print(i)
fun(list)

结果:

哎奇怪了,怎么会出现这样的结果呢?

首先明确,函数参数里的*并不代表着传入的参数一定是列表,而是代表着这里可以接受任意多个无名参数。可以参考这篇文章:Python3 * 和 ** 运算符_极客点儿-CSDN博客

好了,现在我们知道这个*args代表的真正含义了,它并不代表着传入的参数一定是列表。那为什么传入的list没有被当做列表来处理呢?

我们来想想,对于fun(*args)来说,所接受的参数应该是fun(var_1,var_2,...,var_n)的形式,那么,args的元素应该是var_1,var_2,...,var_n,相当于存储的是一个一个的变量。而这里的list,本质上来说就是一个列表类型的变量而已,作为一个整体被传入函数中,args里面实际上只有一个元素,就是一个列表类型的变量list!

实际上,fun函数里执行的语句是这样的:

list=('Hello','World')
print(list)

打印出来的就是以列表的形式显示的list变量,会把括号带上~

所以说,作为函数形参的时候,其实*跟列表的解引用一点关系也没有~

我们来看这种用法的一个实例:

def fun(*args):
    for i in args:
        print(i)
fun("a","star",135)

 结果:

 实际上就是接受了传入的所有参数,args本质上是一个列表,里面的元素就是传入的参数,比如这里就是args=["a","star",135]

那么,我们有没有向函数里面传入列表的各个元素的方法呢?

(2)当作为函数的实参的时候

list=('Hello','World')
def fun(*args):
    for i in args:
        print(i)
fun(*list)

可以比较一下,跟上面代码基本相同,只有最后一行有所差别。

结果:

 

现在我们发现, 打印出了列表内部的元素,也就是说,作为函数实参的时候,*list表示对列表list的解引用,*list事实上是向函数内部传入了两个字符串参数‘Hello'和'World'!

**运算符:

有了*运算符的基础,其实**运算符是完全类似的。

(1)当作为函数的形参的时候

首先我们举一个跟上面类似的例子,

dir={"X":"x","Y":"y","Z":"z"}
def fun(**args):
    for i in args:
        print(i)
fun(dir)

 

 这一次报错了,没有输出结果。原因很简单,**运算符在这里是代表允许接受任意多个键值对,而传入的是一个字典型的变量,并不是一个键值对,类型不匹配当然就报错了。

正确实例:

def fun(**args):
    for i in args.items():
        print(i)
    for key,value in args.items():
        print(key,value)
fun(X="x",Y="y",Z="z")

 

args本质上是一个字典,里面的元素就是传入的键值对,比如这里就是args=["X":"x","Y":"y","Z":"z"]

 注意,向函数里面传键值对的格式跟定义字典型变量的格式是不一样的,向函数里面传键值对的格式是{key=value},而定义字典型变量的格式是{"key":value},但是key都是字符串,value类型可以多样。

(2)当作为函数的实参的时候

dir={"X":"x","Y":"y","Z":"z"}
def fun(**args):
    for i in args:
        print(i)
fun(**dir)

 

作为函数实参的时候,**dir表示对字典dir的解引用,**dir事实上是向函数内部传入了三个键值对参数:key1="X",value1="x",key2="Y",value2="y",key3="Z",value3="z",可以看到输出的结果完全相同。

总结:

*运算符:在作为函数形参时,代表接受任意多个参数,本质上是接收参数构成的列表型变量;

在作为函数传入实参时,代表对元组/列表进行解引用,将元组/列表的多个元素分别传入而不是作为一个整体元组/列表型变量传入。

**运算符:在作为函数形参时,代表接受任意多个键值对,本质上是接收键值对构成的字典型变量;

在作为函数传入实参时,代表对字典进行解引用,将字典的多个键值对分别传入而不是作为一个整体字典型变量传入。

文章已迁移至博客:https://yinkstudio.xyz,之后文章大多在博客上更新,欢迎关注~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值