关于python 的函数默认参数与关键字keyword的想法

看了官方文档的关键字与默认形参后,发现有几处迷惑之处。为什么默认形参和关键字的定义形式基本没有区别;为什么在keyword中不能参杂着position arguments。个人理解:是因为python的参数列表的随意性决定的。

如:

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue')
这个函数,我们可以这样初始化:parrot(19),也可以parrot(19,state='',type=''),也可以parrot(19,type='',action='')来初始化一个实例。所以你无法在keyword中参杂一个position argument,因为编译器不知道它assign给哪一个值。比如:parrot(1,atate='','')后面的空串给谁?
在编译器中都是一视同仁的。
还有一个就是python定义函数时,如果默认对象是一个mutable object,那么它的函数运算就会和c系列有差异。python中的默认值只会初始化一次,并会存储起来。测试代码如下:
def f(a, L=[]):
    L.append(a)
    print(id(L))
    return L

print(f(1))
print(f(2))
print(f(3))

输出结果:
2347964374792
[1]
2347964374792
[1, 2]
2347964374792
[1, 2, 3]
这是mutable object那么换一个字面值常量呢?比如string
测试代码:
def f(a, L=""):
    print(id(L))
    return L

print(f(1))
print(f(2))
print(f(3))
输出结果:
2214607887024


2214607887024


2214607887024
所以有理由相信编译器处理函数默认值是在堆中划一区域存储的,而不是在栈里。
最后keyword就是处理多个default argument时采用的特别名字。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值