函数进阶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中的变量并不是真正存储数据,而是存储的数据所在内存中的地址,我们一般称之为引用
用图来表示如下
既然变量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]
说明
四、引用当做实参
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]