zoukankan      html  css  js  c++  java
  • 53.引用(二)

    引用(二)

    引用当做实参

    • 可变类型与不可变类型的变量分别作为函数参数时,会有什么不同吗?
    • Python有没有类似C语言中的指针传参呢?
    def test1(b):  # 变量b一定是一个局部变量,就看它指向的是谁?可变还是不可变
        b += b  # += 是直接对b指向的空间进行修改,而不是让b指向一个新的
        # b = b+b  # xx = xx+yyy 先把=号右边的结果计算出来,然后让b指向这个新的地方,不管原来b指向谁
                    # 现在b一定指向这个新的地方
    
    # a = [11, 22]
    a = 100
    test1(a)
    print(a)

    总结:

    • Python中函数参数是引用传递(注意不是值传递)
    • 对于不可变类型,因变量不能修改,所以运算不会影响到变量自身
    • 而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量
    # 定义了函数 而且函数有参数
    # 如果调用的函数有参数 我们传入的不是数据 而是引用
    # 分析的
    # 不可变的数据类型 (b += b & b = b + b)
    
    # b += b
    def func1(b ):
        print("内部开始:", id(b))
        b += b
        print("内部结束:", id(b))
    
    # 定义一个全局变量
    a = 10
    print("外部开始:", id(a))
    func1(a)
    print("外部结束:", id(a))

    运行结果:

    外部开始: 10911424
    内部开始: 10911424
    内部结束: 10911744
    外部结束: 10911424

    例子2:

    # b = b + b
    def func2(b):
        print("内部开始:", id(b))
        b = b + b
        print("内部结束:", id(b))
    
    
    # 定义一个全局变量
    a = 10
    print("外部开始:", id(a))
    func2(a)
    print("外部结束:", id(a))

    运行结果:

    外部开始: 10911424
    内部开始: 10911424
    内部结束: 10911744
    外部结束: 10911424

    结论:

    在不可变的数据类型中 无论b+=b还是b=b+b 都是等价的 都是进行重新赋值

    例子3:

    # 可变的数据类型 (b += b & b = b + b)
    # b += b
    def func3(b):
        print("内部开始:", b)
        # 对原来的保存引用的数据进行修改
        #  b+=b -> b.extend(b)
        b += b
        print("内部结束:", b)
    
    
    # 定义一个全局变量
    a = [1, 2]
    print("外部开始:", a)
    func3(a)
    print("外部结束:", a)

    运行结果:

    外部开始: [1, 2]
    内部开始: [1, 2]
    内部结束: [1, 2, 1, 2]
    外部结束: [1, 2, 1, 2]

    例子4:

    # b = b + b
    def func4(b):
        print("内部开始:", b)
        # 对形参b进行了重新赋值
        b = b + b
        print("内部结束:", b)
    
    # 定义一个全局变量
    a = [1, 2]
    print("外部开始:", a)
    func4(a)
    print("外部结束:", a)
    
    # b += b 对原来的数据进行修改 b = b + b 对形参b进行了重新赋值
    
    # 不可变的 无论是b+=b 还是b=b+b 都是重新赋值

    运行结果:

    外部开始: [1, 2]
    内部开始: [1, 2]
    内部结束: [1, 2, 1, 2]
    外部结束: [1, 2]
  • 相关阅读:
    Spring05_基于注解的IOC和DI
    Spring02_基于XML的IOC
    Spring01_概述及程序的耦合
    设计模式六、单例模式
    设计模式五,建造者模式
    前后端分离异常统一处理
    vue qs.stringify 和JSON.stringify 区别
    设计模式四、抽象工厂模式
    设计模式三、工厂方法模式
    设计模式二、简单工厂模式——静态工厂模式
  • 原文地址:https://www.cnblogs.com/kangwenju/p/12840195.html
Copyright © 2011-2022 走看看