• python参数传递小记


    0 写在前面

    常用的参数传递分为值传递(对应形参)和引用传递(对应实参),形参和实参的一大区别就是改变形参原参数对象不会改变,而实参则会。
    参考材料:
    CSDN

    1 值传递

    方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
    如下:

    a=520
    b=a
    print(a,b)
    b=600
    print(a,b)
    

    结果会是:

    520 520
    520 600
    

    或者在函数中:

    def add(a,b):
        a = a+b
        b = 3
        return a
    
    a = 2
    b = 1
    print(a,b)
    print(add(a,b))
    print(a,b)
    

    结果会是:

    2 1
    3
    2 1
    

    2 引用传递

    也称地址传递,在方法调用时,实际上是把参数的引用(传的是地址,而不是参数的值)传递给方法中对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
    如下:

    a = [1,2]
    b = a
    print(a,b)
    b[0] = 2 
    print(a,b)
    b = [2,3] # 相当于重新赋值
    print(a,b)
    

    结果会是:

    [1, 2] [1, 2]
    [2, 2] [2, 2]
    [2, 2] [2, 3]
    

    在函数中:

    def add(a,b):
        a = a+b[0]
        b[0] = 3
        return a
    a = 2
    b = [1,3]
    print(a,b)
    print(add(a,b))
    print(a,b)
    

    结果会是:

    2 [1, 3]
    3
    2 [3, 3]
    

    3 小结

    在Python中,数字、字符或者元组等不可变对象类型都属于值传递,而字典dict或者列表list等可变对象类型属于引用传递,因此涉及列表等的参数传递需小心仔细。如果希望字典进行值传递,则需要用到copy方法,copy分为浅拷贝和深拷贝。如下:

    import copy
    l1 = [[1, 2], 3]
    l2 = copy.copy(l1)
    l3 = copy.deepcopy(l1)
    l2.append(4)
    l2[0].append(5)
    l3[0].append(6)
    print(l1,l2,l3)
    

    结果如下:

    [[1, 2, 5], 3] [[1, 2, 5], 3, 4] [[1, 2, 6], 3]
    

    如上,copy.copy属于浅拷贝,拷贝的是第一层list(l2[0]仍然是引用传递),而copy.deepcopy属于深拷贝,对list所有子元素都进行深拷贝。

  • 相关阅读:
    浏览器检测
    EcmaScript基础
    js中的内置对象
    cursor 与refcursor及sys_refcursor的区别 (转载)
    各种连接数据方法的网站
    UVa11627 Slalom
    UVa1450 Airport
    UVa12124 Assemble
    UVa11384 Help is needed for Dexter
    UVa11464 Even Parity
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13281711.html
Copyright © 2020-2023  润新知