python函数传参意义示例详解

编辑: admin 分类: python 发布时间: 2021-12-03 来源:互联网
目录

    C++这样的语言用多了之后,在Python函数传递参数的时候,经常会遇到一个问题,我要传递一个引用怎么办?
    比如我们想要传一个x到函数中做个运算改变x的值:

    def change(y):
        y += 1
    x = 1
    print ("before change:", x)
    change(x)
    print ("after change: ", x)

    得到的结果是

    before change: 1
    after change:  1

    完全没用~~~这是怎么回事?
    我来说明一下这个过程~

    参数传递

    也就是说python中的等号就是把变量指向了一个实例而已。
    那么,如何做到其它语言中引用这样的效果呢?一个比较推荐的方法就是用把参数return回去就可以了,如下面代码所示。

    def change(y):
        y += 1
        return y
    
    x = 1
    print ("before change:", x)
    x = change(x)
    print ("after change: ", x)

    结果为

    before change: 1
    after change:  2

    另一种方法就是,我们不让函数中的参数指向新的地址不就可以了,我们让它在原来的地址上修改我们的值。这一点,只有一部分的数据类型可以做到,我们把这样的对象叫做可变对象,做不到的就叫不可变对象。

    • 不可变对象:int,string,float,tuple 等
    • 可变对象 :list,dictionary 等

    举几个例子更为通俗易懂

    def change(x):
        print ("before append:", x, "id:", id(x))
        x.append(0)
        print ("after append:", x, "id:", id(x))
    x = [1, 2, 3]
    print ("before change:", x, "id:", id(x))
    change(x)
    print ("after change:", x, "id:", id(x))
    before change: [1, 2, 3] id: 140623459512008
    before append: [1, 2, 3] id: 140623459512008
    after append: [1, 2, 3, 0] id: 140623459512008
    after change: [1, 2, 3, 0] id: 140623459512008

    由于list在做append操作时,x指向的地址是不变的,所以可以有引用的效果,x[0] = 4这样的操作也是没问题的
    然而,如果是把x指向了新的地址就不行了,如下

    def change(x):
        print ("before equal:", x, "id:", id(x))
        x = [5]
        print ("after equal:", x, "id:", id(x))
    
    x = [1, 2, 3]
    print ("before change:", x, "id:", id(x))
    change(x)
    print ("after change:", x, "id:", id(x))
    before change: [1, 2, 3] id: 139683058095432
    before equal: [1, 2, 3] id: 139683058095432
    after equal: [5] id: 139683058028360
    after change: [1, 2, 3] id: 139683058095432

    这下应该就搞清楚是怎么回事了吧,不过正是因为python的这种特性,在函数设置默认参数的时候,我们要注意尽量不用可变对象当默认值,否则会发生下面这种情况

    def change(x=[]):
        x.append(1)
        return x
    
    print (change())
    print (change())

    [1]
    [1, 1]

    比较妥当的做法是用不可变对象来代替[],比如None

    def change(x=None):
        if not x:
            x = []
        x.append(1)
        return x
    
    print (change())
    print (change())

    此时的输出为

    [1]
    [1]

    以上就是python函数传参意义示例详解的详细内容,更多关于python函数传参的资料请关注hwidc其它相关文章!

    【文章原创作者:http://www.1234xp.com/shsgf.html转载请保留出处】