• 函数进阶5.4引用


    一、引入

    如下代码中,最后b的值为多少?

    >>> a = 1
    >>> b = a
    >>> b
    1
    >>> a = 2
    >>> a
    2
    

      

     

    如下代码中,最后b的值为多少?

    >>> a = [1, 2]
    >>> b = a
    >>> b
    [1, 2]
    >>> a.append(3)
    >>> a
    [1, 2, 3]
    

      

     

    二、引用是什么

    引用:就是地址

    那地址是什么呢?可以理解为存放数据的空间在内存中的编号

    例如

    a = 100
    

      

    怎样知道它的地址呢?

    id(a)
    

      

    可以直接将上述的结果打印

    print(id(a))
    

      

    运行结果(可能不相同)

    4347271232
    

      

    当我们知道了原来引用就是地址之后,再来看

    a = [1, 2]
    

      

    我们可以用id(a)后去它的地址

    a = [1, 2]
    print(id(a))  # 获取变量存储的引用(地址)是多少
    

      

     

    接下来定义变量b且赋值

    a = [1, 2]
    print(id(a))  # 获取变量存储的引用(地址)是多少
    
    b = a
    

      

     

    此时我们输出变量b的引用

    a = [1, 2]
    print(id(a))
    
    b = a
    print(id(b))
    

      

     

    运行如上代码,如下(可能不相同)

    4558971360
    4558971360
    

      

     

    这说明,此时变量a、b存储的引用都是相同的

    由此我们可以得出一个结论:Python中的变量并不是真正存储数据,而是存储的数据所在内存中的地址,我们一般称之为引用

    用图来表示如下

    image-20200902173009019

    既然变量a、b都指向同一个列表,那么接下来

    a.apend(3)
    

      

    此时变量a、b指向的同一个列表中多了一个数据,即此时列表为[1, 2, 3]

    所以a、b此时用print输出相同的结果

    三、赋值运算符=

    赋值运算符=,之前为了更好的理解变量,把a=100理解为变量a中存放了100,事实上变量a存储是100的引用

    也就是说:在Python中只要用=那么就表示=左边的变量存储了一个新的引用

    大白话讲:就是=左边的变量指向了右边的数据

    想想下面的代码运行的结果是什么?

    a = [1, 2]
    b = a
    b.append(3)
    b = [100, 200, 300]
    
    print(b)
    

      

     

    运行结果

    [100, 200, 300]
    

      

    而不是

    [1, 2, 3]
    

      

    说明

    image-20200902174423267

    四、引用当做实参

    Python中调用函数时,传递实参实际上都是是引用,即传递的都是地址

    只要是传递的引用,那么也就是说在函数中是可以直接对指向的数据进行修改

    def test(p):
        # 此时变量p也指向nums指向的列表
        p.append(44)
        print("在函数test中,p=", p)
    
    
    nums = [11, 22, 33]
    print("调用test函数之前,nums=", nums)
    test(nums)  # 此时将列表的引用当做了实参进行传递
    print("调用test函数之前,nums=", nums)
    

      

     

    运行结果

    调用test函数之前,nums= [11, 22, 33]
    在函数test中,p= [11, 22, 33, 44]
    调用test函数之前,nums= [11, 22, 33, 44]
    

      

     
  • 相关阅读:
    计算机通信
    笔记0402
    笔记0414
    vb6 VS vb.net int数据类型
    jQuery好网站
    jQuery实现图片翻滚
    jQuery获取一组单选按钮的值
    Redhat安装、使用及服务器应用FAQ
    js判断变量是否赋值(存在)
    IDE 与SATA区别
  • 原文地址:https://www.cnblogs.com/dong4716138/p/15703264.html
Copyright © 2020-2023  润新知