python中函数形参为默认列表(或可变数据类型)的情形详细描述

首先我们来通过一段代码来解释函数形参为默认列表的情形: 

def func(ls = []):
    ls.append(1)
    return ls
a = func()
b = func()
print(a,b)

如上代码运行的结果为[1, 1] [1, 1],为什么a和b的值都是[1, 1] ?而不是[1] [1,1]呢?

分析:

上面的代码中函数func的形参为一个默认参数列表ls,ls为空的列表,当执行函数a= func()时,将会在系统内存中创建一个列表ls,创建过程如下:

                      

首先 ①、在内存在开辟1个空间保存1个空列表,该空间有自己的编号,在python中可以通过id()函数来查询该空间的编号【如果不明白id()函数的同学可以百度补习一下】,假设本次程序运行时,空列表的编号为2083965093768,即id = 2083965093768。而将该空列表赋值给ls时,也是将ls指向id编号,建立一个映射连接。

函数内部执行ls.append(1)之后,空间状态为:

                                 

②、函数将结果 ls返回给a时的空间状态为:

                                    

可以看出a变量也指向了空间id =  2083965093768的位置。而并不是为a变量重新开辟一个内存空间,这样的好处在于大大节约了空间的消耗。

③、当执行第二次函数调用b = func()时,由于ls是一个可变数据类型【可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。】,再次调用函数时,函数参数传递的依旧是id 2083965093768,ls依旧指向该内存空间。再次执行ls.append(1)之后,id =  2083965093768的内存空间里存储的列表变成[1,1]。

                                     

此时看到ls,a,b变量都是指向id =  2083965093768的内存空间,而对应空间的内容为[1,1]。因此最中代码输出的结果是[1, 1] [1, 1]。

也可以通过如下代码来验证:

def func(ls = []):
    ls.append(1)
    print("ls的id为:{},ls = {}".format(id(ls),ls))
    return ls
print("第一次调用func()函数:")
a = func()
print("a的id为:",id(a))
print("第二次调用func()函数:")
b = func()
print("b的id为:",id(b))
print(a,b)


 

如上代码添加了一些变量id打印语句。作者运行的结果为:

第一次调用func()函数:
ls的id为:2652662843784,ls = [1]
a的id为: 2652662843784
第二次调用func()函数:
ls的id为:2652662843784,ls = [1, 1]
b的id为: 2652662843784
[1, 1] [1, 1]

可以看出打印的id都相同,也验证了如上的说法。

获取:点击获取 计算机二级python全套教学​

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值