python中关于传参的一些坑
2019-08-28 本文已影响0人
互联网中的一个咸鱼
一、Python中的第一个坑,定义默认参数,必须指向不变对象
定义这样一个
def add_li(li=[]):
li.append('END')
print(li)
调用函数
正常调用
add_li([1,2,3]) 正常输出
[1,2,3,'END']
add_li(li=[1,2,3]) 关键字传参
[1,2,3,'END']
add_li()
['END']
上面这些传参都没有问题 ,但是如果这样
add_li()
add_li()
会输出什么呢 ?
['END']
['END','END']
原因
函数在定义的时候,默认参数li的值就计算出来了,[],默认参数也是一个变量,指向对象[],每次调用函数,如果改变了
image.pngli
的内容,那么下次调用的时候,默认参数的内容就变了,不再是定义的[]了
image.png
补充:在定义函数的时候只会定义一次,给默认参数分配一个内存地址,对于可变数据,这个内存地址是不可变的
Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
二、python报错local variable 'xxx' referenced before assignment
image.png报错的意思是 `变量在引用之前没有定义‵
原因是:
在python中的函数和全局同名的变量,如果修改的话,变量的值就会变成局部变量,在修改之前对变量的引用就会出现没有定义的错误
解决办法
image.png声明这个变量是全局的
值传递可以理解为对不可变数据类型赋值操作,重新分配一个内存空间
引用传递可以理解为对可变类型进行赋值操作,修改内存地址内的内容