• Python学习记录 函数基础



    2022.08.08 DAY23

    1. 函数的用法和底层分析

    1. 参数的传递

    • Python中参数的传递都是“引用传递”。

    • 具体操作可分为两类:

      • 对“可变对象”进行“写操作”,直接作用域原对象本身。
      • 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。
    • 可变对象有:

      • 字典、列表、集合、自定义对象等
    • 不可变对象有:

      • 数字、字符串、元组、function等

    2.传递不可变对象的引用

    • 传递参数是不可变对象,实际传递还是对象的引用。在“复制操作”中,由于不可变对象无法修改,系统会新创建一个对象。

    3. 浅拷贝与深拷贝

    • 内置函数copy(浅拷贝)、deepcopy(深拷贝)
    • 浅拷贝:不拷贝子对象的内容,只拷贝子对象的引用。
    • 深拷贝:会连子对象的内容全部拷贝一份,对子对象的修改不会影响源对象。

    浅拷贝示例代码:

    import copy
    
    a_list = [20, 50, [5, 6]]
    b_list = copy.copy(a_list)
    
    def test():
        print("a : ", a_list)
        print("b : ", b_list)
    
        b_list.append(100)
        b_list[2].append(200)
        print("浅拷贝...")
        print("a : ", a_list)
        print("b : ", b_list)
    
    
    if __name__ == '__main__':
        test()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行结果:

        a :  [20, 50, [5, 6]]
        b :  [20, 50, [5, 6]]
        浅拷贝...
        a :  [20, 50, [5, 6, 200]]
        b :  [20, 50, [5, 6, 200], 100]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    深拷贝示例代码:

    import copy
    
    def test_deepcopy():
        a_list = [20, 50, [5, 6]]
        b_list = copy.deepcopy(a_list)
    
        print("a : ", a_list)
        print("b : ", b_list)
    
        b_list.append(100)
        b_list[2].append(200)
        print("深拷贝...")
        print("a : ", a_list)
        print("b : ", b_list)
    
    
    if __name__ == '__main__':
        test_deepcopy()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行结果:

    a :  [20, 50, [5, 6]]
    b :  [20, 50, [5, 6]]
    深拷贝...
    a :  [20, 50, [5, 6]]
    b :  [20, 50, [5, 6, 200], 100]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.不可变对象含可变子对象

    • 传递不可变对象(数字、字符串、元组、function)时,不可变对象里包含的子对象是可变的,则方法内修改了这个可变对象,源对象也发生了变化。

    4.参数的几种类型

    • 位置参数

      • 函数调用时,实参默认按照顺序传递,需要个数和形参匹配。
    • 默认值参数

      • 参数设置默认值,这样的参数在传递时就是可选的。
      • 默认值参数放在位置参数的后面。
    • 命名参数

      • 可以按照形参的名称传递参数。
    • 可变参数

      • 可变数量的参数
      • *param 将多个参数收集到一个“元组”对象中。
      • **param 将多个参数收集到一个“字典”对象中。
    • 强制命名参数

      • 可变参数后面新增新的参数,必须是“强制命名参数”。
  • 相关阅读:
    C++11 - 5 - function包装器
    8086与8088
    Dart语言基础
    URLConnection程序报java.net.ConnectException: Connection refused: connect
    空间几何(点线面)知识整理
    【Python知识】谈谈Python的抽象类
    element 表格气泡是如何实现的
    【DDR3 控制器设计】(5)DDR3 的仲裁读写操作设计
    颜值即正义,献礼就业季,打造多颜色多字体双飞翼布局技术简历模版(Resume)
    加速开发容错量子计算应用!PsiQuantum官宣将在英国干大事
  • 原文地址:https://blog.csdn.net/Code_peasant/article/details/126229399