已有184人关注
关于函数返回值的问题
发表在Python图书答疑 2019-03-10 《零基础学Python》第6章 函数 174页-174页
是否精华
版块置顶:

Xshot-0040.png

老师您好!如图所示,函数参数的默认值是[],为什么调用demo()和demo([])的结果不同?demo()的默认参数不就是[]吗?我觉得两个结果应该一样才对啊

分享到:
精彩评论 5
无语_mrkj
学分:3155 LV11
2019-03-12
沙发

您可以使用下面的代码测试一下:

def demo(obj=[]):

    print(id(obj),obj)

    obj.append("1")

调用demo()和demo([])时,obj对应的对象的内存地址是不一样的,所以不是一个对象,也就不能得到一样的结果了。

convey21
学分:39 LV2
2019-03-12
板凳

无语_mrkj 发表于2019-03-12 17:23

您可以使用下面的代码测试一下:

def demo(obj=[]):

    print(id(obj),obj)

    obj.append("1")

调用demo()和demo([])时,obj对应的对象的内存地址是不一样的,所以不是一个对象,也就不能得到一样的结果了。

谢谢老师的回答!我用您给的代码测试过了,的确两个obj对应对象的内存地址是不一样的。但是为什么这两个obj对应的不是一个对象?没有给设置了默认值的函数指定传递的参数不应该就传递默认参数吗obj=[]吗?是不是因为默认参数指向了可变对象,就会使这两个obj对应的不是同一个对象?谢谢老师!

无语_mrkj
学分:3155 LV11
2019-03-13
地板

1、采用默认值时和指定空列表时,虽然都是空列表,但它们也不是同一个对象,所以内存地址就不一样了。但是由于在使用默认值时,这个默认值是一个可变对象,所以它使用的就是可变对象obj,这个值在每次改变后,下次在使用时就用新的值了。

2、没有给设置了默认值的函数指定传递的参数时使用的就是默认参数obj=[]。

convey21
学分:39 LV2
2019-03-13
4L

无语_mrkj 发表于2019-03-13 09:59

1、采用默认值时和指定空列表时,虽然都是空列表,但它们也不是同一个对象,所以内存地址就不一样了。但是由于在使用默认值时,这个默认值是一个可变对象,所以它使用的就是可变对象obj,这个值在每次改变后,下次在使用时就用新的值了。

2、没有给设置了默认值的函数指定传递的参数时使用的就是默认参数obj=[]。

好的,谢谢老师的耐心解答!

无语_mrkj
学分:3155 LV11
2019-03-13
5L

,不用客气

首页上一页 1 下一页尾页 5 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照