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,)
时间: 2024-10-05 09:36:41

Python学习(七)——可变与不可变参数的相关文章

Python学习笔记五,函数及其参数

在Python中如何自定义函数:其格式为 def 函数名(函数参数): 内容 交互模式下编写函数完毕按两次回车返回>>> pass作为函数为空函数的占位符(她的意思是什么都不做),也就是说没想好写什么函数,先用pass占位,然后先让程序跑起来: 数据类型检查可以用内置函数isinstance(object,calssinfo)实现:如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True.如果object不是一个给定类型的的对

Python学习(七) 杂学

无论windos还是Linux只要安装了python,配置好了环境变量,则在命令行输入python这个命令的时候就会进入交互模式.在这个模式下可以进行一些简单的python代码编写.退出可以使用exit()方法. Python程序是可以执行的,例如下面代码,保存在hello.py中,如果想要执行这个文件则可以执行命令python hello.py,那么将会输出Hello World. print 'Hello World' 另外,如果想让这个脚本成为可执行文件,则需要在这个文件头上添加 #!/u

Python学习七步走

在周五的下午三点钟(为什么是这个时间?因为事情总会在周五下午三点钟发生),你收到一条通知,客户发现你的软件出现一个错误.在有了初步的怀疑后,你联系运维,查看你的软件日志以了解发生了什么,因为你记得收到过日志已经搬家了的通知. 结果这些日志被转移到了你获取不到的地方,但它们正在导入到一个网页应用中——所以到时候你可以用这个漂亮的应用来检索日志,但是,这个应用现在还没完成.这个应用预计会在几天内完成.我知道,你觉得这完全不切实际.然而并不是,日志或者日志消息似乎经常在错误的时间消失不见.在我们开始查

python学习七(if判断)

流程控制语句 简介 python代码在执行时是按照自上向下执行的. 通过流程控制语句,可以改变程序的执行顺序,也可以指定程序反复执行多次 流程控制语句分为两大类:条件判断语句,循环语句 条件语句(if语句) 语法: if 条件表达式 : 代码快 执行的流程: if语句在执行时,会先对条件表达式进行求值判断, 如果为True,则执行if后的语句 如果为False,则不执行 如: if True:print("你猜我出来不?") #条件为True执行 if False:print(&quo

Python学习笔记(三): 收集参数

如下代码: >>>def print_params(title,*params) print title print params >>>print_params('Params:',1,2,3) Params: (1,2,3) *的作用是:收集其余的位置参数,返回一个元组,如果不提供任何供收集的元素,params就是个空元组(). >>>def print_params(title,**params) print title print params

Python中函数的参数传递与可变长参数

1.Python中也有像C++一样的默认缺省函数 1 def foo(text,num=0): 2 print text,num 3 4 foo("asd") #asd 0 5 foo("def",100) #def 100 定义有默认参数的函数时,这些默认值参数位置必须都在非默认值参数后面. 调用时提供默认值参数值时,使用提供的值,否则使用默认值. 2.Python可以根据参数名传参数 1 def foo(ip,port): 2 print "%s:%d

[Python]可变类型,默认参数与学弟的困惑

一.学弟的困惑 十天前一个夜阑人静.月明星稀的夜晚,我和我的朋友们正在学校东门的小餐馆里吃着方圆3里内最美味的牛蛙,唱着最好听的歌儿,畅聊人生的意义.突然,我的手机一震,气氛瞬间就安静下来,看着牛蛙碗里三双贪婪的筷子,我犹豫了:不——我的肉…但是本着不让人久等的原则,我不舍地放下了筷子.点亮屏幕,我的眉头不禁紧锁,事情好像并不简单… 什么,还上升到了去医院的程度?现在的年轻人怎么了,怎么那么不注意安全,嗨,真是一届不如一届了,不过也好,没受伤就好…正当我沉浸在我自己的瞎想时,一张图片紧接着医院那

python 深拷贝和浅拷贝之可变和不可变对象总结

了解深拷贝和浅拷贝之前先要理解可变与不可变对象 python只允许使用引用传递,有可变对象和不可变对象,可变对象:list,dict.不可变对象有:int,string,float,tuple Python int,string,float,tuple不可变举栗子: def int_object(): i = 89 j = 89 print(id(89)) print('i id:' + str(id(i))) print('j id:' + str(id(j))) print(i is j)

据廖雪峰python3教程----python学习第七天

函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了. python的函数除了正常的定义必选参数外,还可以使用默认参数,可变参数合关键字参数, 位置参数 定义一个计算x 的平方的函数 >>> def power(x):               #参数 x 就是一个位置参数      return x**2 >>> power(5) 25 >>> power(15) 225 为了方便我们再定义一个可以计算 x 的任意次的