Python学习(七)——可变与不可变参数

下面一段代码演示了可变与不可变默认参数的区别,通过查看内存地址以及每次函数调用之后的默认参数的变化,可以看出两段代码为什么会产生不同的结果。

# -*- coding: cp936 -*- 
# 上面一句是为了中文编码问题
# 默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。
# 例如,下面的函数在后续调用过程中会累积(前面)传给它的参数

def f(a,L=[]):
	print('默认参数地址为:'+str(id(L)))
	L.append(a)
	print('改变后的参数地址为:'+str(id(L)))
	return L

# 如果不想参数累积,可以如下定义
def f1(a,L1=None):
	print('默认参数地址为:'+str(id(L1)))
	if L1 is None:
		L1=[]
	L1.append(a)
	print('改变后参数地址为:'+str(id(L1)))
	return L1

# python中是引用赋值,list/dict均为可变类型,字符串/tuple为不可变类型
#下面可以看看这两段代码有什么不同
# f测试	
print(f(1))
print('函数f的默认参数为'+str(f.__defaults__))
print(f(2))
print('函数f的默认参数为'+str(f.__defaults__))
print(f(3))
print('函数f的默认参数为'+str(f.__defaults__))

# f1测试
print(f1(1))
print('函数f1的默认参数为'+str(f1.__defaults__))
print(f1(2))
print('函数f1的默认参数为'+str(f1.__defaults__))
print(f1(3))
print('函数f1的默认参数为'+str(f1.__defaults__))

运行结果:

C:\Users\zzw922cn\Desktop>python 1.py
默认参数地址为:56716224
改变后的参数地址为:56716224
[1]
函数f的默认参数为([1],)
默认参数地址为:56716224
改变后的参数地址为:56716224
[1, 2]
函数f的默认参数为([1, 2],)
默认参数地址为:56716224
改变后的参数地址为:56716224
[1, 2, 3]
函数f的默认参数为([1, 2, 3],)
默认参数地址为:1525627488
改变后参数地址为:56738440
[1]
函数f1的默认参数为(None,)
默认参数地址为:1525627488
改变后参数地址为:56738440
[2]
函数f1的默认参数为(None,)
默认参数地址为:1525627488
改变后参数地址为:56738440
[3]
函数f1的默认参数为(None,)


转载于:https://my.oschina.net/zzw922cn/blog/509088

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值