函数进阶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]