Python变量引用浅析

引言:
对于刚接触Python语言的同学来说,可能不太了解Python中参数赋值的机制:在Python中,对一个变量的赋值,实际上是修改了数据的引用。 本文将在下面举几个例子来帮助说明该机制


首先我们来证明一下,对于变量的赋值实际上是修改了数据的引用这个描述:


从ipython的运行结果中,我们可以看出,当给一个变量赋值时,其实对于该变量 a而言,只是一个标签(数据的引用),类似于下图

而将以赋值的变量 a赋给另一个新变量b时,实际上,对于该新变量 b而言,依然是该以赋值变量 a所对应的常量 10的一个标签,类似于下图

所以当我们修改 a的值,并不会修改 b的引用,只是简单地把 a修改为了新值 20的引用,此时对应的图示为


函数参数的传递:
结论:对于Python中函数参数的传递,这一点有别于其他语言,他传递的是实参所对应的引用而不是实参所对应的值。
我们用一个测试程序来帮助说明:
[Note:python中的id函数返回的结果是该参数对应的内存地址]

def printID(para):
	print("Input para's id is {}".format(id(para)))

para = 10
print("10's id is {}".format(id(para)))
printID(para)

-------------------------
输出结果:
10's id is 1746174320
Input para's id is 1746174320

由此可见,在传递参数时,确实传递的是引用。

函数返回值的传递:
结论:函数在传递返回值时,也是传递该参数对应数据的引用。
我们用一个测试程序来帮助说明:

def printID():
	r = 2
	print("2's id = {}".format(id(2)))
	return r

r = printID()
print("r's id = {}".format(id(r)))

---------------------------------
输出结果:
2's id = 1746174064
r's id = 1746174064

由此可见,函数在传递返回值确实传递也是该参数对应数据的引用。

函数内部参数值的修改:
结论:函数中若对传入的参数进行修改,只会在函数中生效,而无法改变传入的实参值:
我们用一个测试程序来帮助说明:

def test(num):
	num = 10
	print("function's num = {}".format(num))

gl_num = 1
test(gl_num)
print("num = {}".format(gl_num))

----------------------------------
输出结果:
function's num = 10
gl_num = 1

为了方便大家更好地理解,我将用下图说明:


再未执行函数中 num = 10这一语句时,两个"标签":num和gl_num的引用图示为红线,当执行 num = 10后, num就指向了 10对应的内存地址,而 gl_num指向的地址依旧不变。 此外,这也能从另一方面说明,函数中传递的参数与实参并不是同一个"标签",只是对于某一个地址的两个不同的"标签"。


如果觉得我有地方讲的不好的或者有错误的欢迎给我留言,谢谢大家阅读(点个赞我可是会很开心的哦)~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值