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的值就计算出来了,[],默认参数也是一个变量,指向对象[],每次调用函数,如果改变了li的内容,那么下次调用的时候,默认参数的内容就变了,不再是定义的[]了

image.png
image.png

补充:在定义函数的时候只会定义一次,给默认参数分配一个内存地址,对于可变数据,这个内存地址是不可变的
Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。

二、python报错local variable 'xxx' referenced before assignment

image.png

报错的意思是 `变量在引用之前没有定义‵

原因是:

在python中的函数和全局同名的变量,如果修改的话,变量的值就会变成局部变量,在修改之前对变量的引用就会出现没有定义的错误

解决办法

image.png

声明这个变量是全局的

值传递可以理解为对不可变数据类型赋值操作,重新分配一个内存空间
引用传递可以理解为对可变类型进行赋值操作,修改内存地址内的内容

上一篇下一篇

猜你喜欢

热点阅读