活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
…
CSDN21天学习挑战赛——day5 python的变量知识
变量新知
我们知道,一个变量可以用以保存数据或返回值,变量和数据都是保存在内存中的,这也是使用自带的标准输出函数中输入变量名后(赋值过的),可以在控制台输出这个保存在变量中的值。在python中,数据与变量是分开存储的,虽然它们都在内存中存储,但是变量是保存数据所在内存中的存储区的地址(也称为引用,这个值可以使用id()方法来查看),数据是保存在内存的某个区内的。也就是我们可以通过变量寻找到相应存储区内的数据。也同样,我们可以通过变量来传输数据或交换数据。
注意:1.一旦修改了变量中的赋值(数据),那么原来数据就不再被引用了,只对现在数据进行引用。
2.变量是用来保存数据在内存中的地址,使用变量可以在内存中找到相应地址的数据。
同时,python中函数的参数传递、返回值都是靠引用传递的,这与指针有些相似。我们可以通过一个简单的小程序来认识变量引用:
a = 1
print("当前变量的值为:%d" % (a))
print("当前值的地址为:%x" % (id(a)))
a = 22
print("当前值的地址为:%x" % (id(a)))
我们发现,当a = 1时,变量引用的值为:188e85300f0,而我们重新对a赋值为22时,变量的引用值变为:188e8530390,这也是我们在使用变量时需要注意的地方。
函数参数与返回值的传递
前面我们提到了,python中函数的参数、返回值都是采用引用进行传递,下面我们写一段小程序来看一下,函数的参数和返回值是如何使用引用进行传递的:
def adds(num1,num2):
print("%d在内存中的地址为:%x" % (num1,id(num1)))
print("%d在内存中的地址为:%x" % (num2,id(num2)))
print("$"*10)
sums = num1 + num2
print("返回值在内存中的地址为:%x" % (id(sums)))
return sums
a = 10
b = 20
print("调用函数前 内存地址是 %x" % id(a))
print("调用函数前 内存地址是 %x" % id(b))
anss = adds(a,b)
print("调用函数后 实参内存地址是 %x" % id(a))
print("调用函数后 实参内存地址是 %x" % id(b))
print("调用函数后 返回值内存地址是 %x" % id(anss))
这是一个求两数之和的函数,我们可以分析以下结果:程序执行的步骤是,先执行主函数,然后再执行函数,于是首先a和b被赋值,也就是变量引用开始,这时,实参的引用值为a和b在内存中的地址。然后,执行到函数调用后,开始运行函数内的程序:我们可以发现,a和b的引用值与num1和num2的引用值相同,即我们将实参的引用和数据传递到了函数的形参中,使其能运行函数内的功能,同时,计算num1与num2的和并将其和作为返回值,输出返回值的引用值。
运行结果:
调用函数前 内存地址是 2ad9f380210
调用函数前 内存地址是 2ad9f380350
10在内存中的地址为:2ad9f380210
20在内存中的地址为:2ad9f380350
$$$$$$$$$$
返回值在内存中的地址为:2ad9f380490
调用函数后 实参内存地址是 2ad9f380210
调用函数后 实参内存地址是 2ad9f380350
调用函数后 返回值内存地址是 2ad9f380490
这样,我们就可以理解函数参数与返回值的传递过程和传递原理了。
全局变量与局部变量
其实,全局变量与局部变量最大的区别就是生命周期不同、使用位置不同。在函数的定义和使用中,最常见的就是这两个变量的问题。请注意,这两个的变量名可以重复,虽然不影响,但是最好不要这样做。先来说局部变量,这个变量常位于函数内部,是只在函数内部使用的变量;它的生命周期较短,一般是从函数执行时被创建,在函数执行结束后被释放;它可以暂时保存函数在被执行期间的数据;可以在函数内修改其引用。其次,来说全局变量,它一般是位于函数定义的上方,是定义在函数外部的变量;生命周期较长;函数内部、主函数也可以使用这个变量;不能直接在函数内部修改其引用和值;可以在函数内部使用global 全局变量名来修改全局变量的值。
注意:1.最好不要将全局变量和局部变量的变量名都命名成相同的。
2.全局变量一般位于函数定义之前,import之后,千万不能在函数调用之后定义一个全局变量,否则会报错。
3.函数执行时,如果要处理变量时,首先会查找函数内部的局部变量,有就使用;如果未找到,那么就查找函数外部的全局变量;如果都没有,则程序报错。
4.最好不要使用全局变量,因为一般把握不住(主要是后期维护麻烦)
结语
今天学习到了变量的新知识,很不错,又是充实的一天呢