引言
:
对于刚接触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
指向的地址依旧不变。
此外,这也能从另一方面说明,函数中传递的参数与实参并不是同一个"标签",只是对于某一个地址的两个不同的"标签"。
如果觉得我有地方讲的不好的或者有错误的欢迎给我留言,谢谢大家阅读(点个赞我可是会很开心的哦)~
遇到一个尴尬事情:
Python 我在方法外定义了一个变量,在方法内引用时候,默认是不引用外部的那个变量的,而是重新定义了一个。为此,温故了一次 Python 的两个关键字 nonlocal 和 global 。
这里方法 test 内的 a 变量相当于重新定义了一个 变量,这个变量跟 最外面的 a变量一点关系都没有呀~
如果想要在 def 方法内给 最外面的 a变量赋...
并且在python中,变量和数据都是保存在内存中的,并且变量和数据时分开存储的。
(1)引用的含义:变量记录的是数据在内存中的地址,并且这个动作就叫做引用
(2)如果已经修改变量的引用,变量不再是原先数据的引用,变成了对新数据的引用(就指向了新的数据的地址,该变量中记录着新的数据)
(3)使用使用id()函数就可以查看变量中保存数据的地址
(4)在计算机中,内存的地址其实就是一个数字,用%d的形式进行输出
三 引用在
python中的变量声明比java的方便不少,与js相似,甚至更简单
在java中声明变量需要知道变量的类型,但是在python中是不需要的,直接x = 100即可,如果是声明字符串就是x = "100"或者 x = '100'都可以,比js中的var还要简便。
声明变量后,我们就要引用它了
输出是这样的
引用数字时用%d作为占位符,在后面用%变量名引用变量,引用字符串时用