如下代码中,最后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()就是调用函数