美文网首页
python中关于传参的一些坑

python中关于传参的一些坑

作者: 互联网中的一个咸鱼 | 来源:发表于2019-08-28 14:46 被阅读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

    声明这个变量是全局的

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

    相关文章

      网友评论

          本文标题:python中关于传参的一些坑

          本文链接:https://www.haomeiwen.com/subject/bnqpectx.html