33.Python语言中的引用

李光朱课程 2024-03-27 02:07:36
引入

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

>>> a = 1>>> b = a>>> b1>>> a = 2>>> a2

如下代码中,最后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 = aprint(id(b))

运行结果(不同机器上的内存地址可能不相同):

45589713604558971360

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

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

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

a.append(3)

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

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

补充内容

大家自己试试看a=257, b=257时它们的id还是否会相等。事实上Python 为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。而Python 对小整数的定义是 [-5, 257),只有数字在-5到256之间它们的id才会相等,超过了这个范围就不行了,同样的道理,字符串对象也有一个类似的缓冲池,超过区间范围内自然不会相等了。**

总的来说,只有数值型和字符串型,并且在通用对象池中的情况下,a is b才为True,否则当a和b是int,str,tuple,list,dict或set型时,a is b均为False。

赋值运算符=

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

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

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

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

a = [1, 2]b = ab.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]函数名也是引用引入

阅读如下代码,思考会输出什么结果

def test1(): print("我是test1函数哦。。。。")def test2(): print("我是test2函数哦。。。。")test1()test1 = test2test1()

运行结果如下:

我是test1函数哦。。。。我是test2函数哦。。。。

你可能会惊讶,为什么第9行调用test1函数输出的是我是test1函数哦。。。。,反而到了第12行再次调用test1函数时变成了我是test2函数哦。。。。

上述问题的原因核心点是:在Python中即使是函数名也是一个变量名,只不过这个变量没有指向普通的数据,而是指向了一段代码;也就是说如果定义了一个函数名字叫做test1就好比是一个变量名test1指向了那个代码块而已,所以当上述代码第11行test1 = test2时,就相当于让test1变量不在指向原本的代码块,而是指向新的代码块即test2指向的代码块,所以当第12行执行test1函数时,会输出我是test2函数哦。。。。

引用的作用

看完上述的引入知识后,相信你会对什么是函数的引入有一个大体的认知了

在此简单总结:所谓函数名当做引用,其实是指在Python中所有的函数名实际上是一个变量名,只不过这个变量名指向的不是常见的数据,而是一段代码,当我们用函数名()是实际上就是让指向的这块代码开始执行,当我们只用函数名时其实就是这个函数的引用

记住:既然函数名也是变量名,那么就可以给它赋值获取它的引用给别的变量

总结:

使用def定义的函数名,实际就是个变量名它存储了函数的引用如果将另外一个变量,例如b保存了函数的引用,即也指向了同一个函数,那么b()就是调用函数

0 阅读:0

李光朱课程

简介:感谢大家的关注