python默认参数只被解释一次_深入讲解Python函数中参数的使用及默认参数的陷阱...

a executed

不带参数调用,使用默认参数

id(x): 140038854650552

x: [5]

([5],)

id(b.__defaults__[0]): 140038854650552

不带参数调用,使用默认参数

id(x): 140038854650552

x: [5, 5]

([5, 5],)

id(b.__defaults__[0]): 140038854650552

带参数调用,传入一个list

id(x): 140038854732400

x: [5]

([5, 5],)

id(b.__defaults__[0]): 140038854650552

带参数调用,传入一个list

id(x): 140038854732472

x: [5]

([5, 5],)

id(b.__defaults__[0]): 140038854650552

简单分析一下输出结果:

第1行

在定义函数b(),即执行def语句,代码第7行def b(x=a()):的时候,这句话使用了默认参数,所以在定义的时候会计算默认参数x的值,这个时候会调用a(),所以打印出了a executed。

第2~6行

第一次执行循环,代码第14行调用b()没有传递参数,使用默认参数,此时x=[],所以调用一次之后

print b.__defaults__

输出结果为

复制代码 代码如下:

([5],)

第7~11行

第二次循环,代码第14行调用b()没有传递参数,使用默认参数。

注意:默认参数只会计算一次,也就是说那个内存区域就固定了,但是这个地址所指向的是一个list,内容可以改变,此时由于上一次调用x: [5],所以

print b.__defaults__

输出结果为

([5, 5],)

第12~16行

第二个循环语句,第一次循环,代码第20行传入一个空的list,所以不使用默认参数,此时x=[],所以

print b.__defaults__

输出结果为

复制代码 代码如下:

([5],)

第18~21行

第二个循环语句,第二次循环,代码第20行传入一个空的list,所以也不使用默认参数,此时仍然是x=[],所以

print b.__defaults__

输出结果依然为

复制代码 代码如下:

([5],)

函数也是对象,因此定义的时候就被执行,默认参数是函数的属性,它的值可能会随着函数被调用而改变。其他对象不都是如此吗?

牢记: 默认参数必须指向不变对象!代码改一下如下:

# coding=utf-8

def a():

print "a executed"

return None

def b(x=a()):

print "id(x):", id(x)

if x is None:

x = []

x.append(5)

print "x:", x

for i in range(2):

print "不带参数调用,使用默认参数"

b()

print b.__defaults__

print "id(b.__defaults__[0]):", id(b.__defaults__[0])

for i in range(2):

print "带参数调用,传入一个list"

b(list())

print b.__defaults__

print "id(b.__defaults__[0]):", id(b.__defaults__[0])

此时的输出结果看看是什么:

a executed

不带参数调用,使用默认参数

id(x): 9568656

x: [5]

(None,)

id(b.__defaults__[0]): 9568656

不带参数调用,使用默认参数

id(x): 9568656

x: [5]

(None,)

id(b.__defaults__[0]): 9568656

带参数调用,传入一个list

id(x): 140725126699632

x: [5]

(None,)

id(b.__defaults__[0]): 9568656

带参数调用,传入一个list

id(x): 140725126699704

x: [5]

(None,)

id(b.__defaults__[0]): 9568656

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

相关文章

相关视频

网友评论

文明上网理性发言,请遵守 新闻评论服务协议我要评论

立即提交

专题推荐独孤九贱-php全栈开发教程

全栈 100W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

玉女心经-web前端开发教程

入门 50W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

天龙八部-实战开发教程

实战 80W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

php中文网:公益在线php培训,帮助PHP学习者快速成长!

Copyright 2014-2020 https://www.php.cn/ All Rights Reserved | 苏ICP备2020058653号-1

  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值