Python中的全局变量与局部变量的技术学习
学习Python编程语言是一件非常枯燥的事情,但经历过这个阶段后,你的学习效率就会突飞猛进。千锋郑州Python培训的老师给你分享变量作用域的有效范围,巩固技术知识点。
一. 变量作用域:变量的有效范围
a) 引言:变量并不是在哪个位置都可以访问的,访问权取决于该变量实在哪里赋值的。在编程中,变量的作用域从代码结构上可以分成块级,函数,类,模块等。但是在python中没有块级作用域,也就是类似if语句块,for语句块是不存在作用域概念的。
i. Test:
>>> if True: # if语句块没有作用域
x = 1
>>> x
1
>>> def func(): # 函数有作用域
a = 8
>>> a
Traceback (most recent call last):
File "", line 1, in
a
NameError: name 'a' is not defined
从上面的例子中,我们可以发现,在if语句内定义的变量x,可以被外部访问,而在函数func()中定义的变量a,则无法在外部访问。
b) 全局变量和局部变量
i. 概念:定义在函数内部的变量拥有一个局部作用域,被叫做局部变量。定义在函数外部的变量拥有一个全局作用域,被称为全局变量。类,模块同理。
ii. 区别:局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内被访问。
iii. global和nonlocal关键字
1. 案例分析:
total = 0 # total是一个全局变量
def plus( arg1, arg2 ):
total = arg1 + arg2 # total在这里是局部变量.
print("函数内局部变量total= ", total)
print("函数内的total的内存地址是: ", id(total))
return total
plus(10, 20)
print("函数外部全局变量total= ", total)
print("函数外的total的内存地址是: ", id(total))
很明显,函数plus内部通过total = arg1 + arg2语句,新建了一个局部变量total,它和外面的全局变量total是两码事。而如果我们,想要在函数内部修改外面的全局变量total呢?使用global关键字!
2. global:指定当前变量使用外部的全局变量
Test:
total = 0 # total是一个全局变量
def plus( arg1, arg2 ):
global total # 使用global关键字申明此处的total引用外部的total
total = arg1 + arg2
print("函数内局部变量total= ", total)
print("函数内的total的内存地址是: ", id(total))
return total
plus(10, 20)
print("函数外部全局变量total= ", total)
print("函数外的total的内存地址是: ", id(total))
打印结果是:
函数内局部变量total= 30
函数内的total的内存地址是: 503494624
函数外部全局变量total= 30
函数外的total的内存地址是: 503494624
3. nonlocal:
a) 案例分析:
a = 1
print("函数outer调用之前全局变量a的内存地址: ", id(a))
def outer():
a = 2
print("函数outer调用之时闭包外部的变量a的内存地址: ", id(a))
def inner():
a = 3
print("函数inner调用之后闭包内部变量a的内存地址: ", id(a))
inner()
print("函数inner调用之后,闭包外部的变量a的内存地址: ", id(a))
outer()
print("函数outer执行完毕,全局变量a的内存地址: ", id(a))
如果你将前面的知识点都理解通透了,那么这里应该没什么问题,三个a各是各的a,各自有不同的内存地址,是三个不同的变量。打印结果也很好的证明了这点:
函数outer调用之前全局变量a的内存地址: 493204544
函数outer调用之时闭包外部的变量a的内存地址: 493204576
函数inner调用之后闭包内部变量a的内存地址: 493204608
函数inner调用之后,闭包外部的变量a的内存地址: 493204576
函数outer执行完毕,全局变量a的内存地址: 493204544
那么,如果,inner内部想使用outer里面的那个a,而不是全局变量的那个a,怎么办?用global关键字?答案是使用nonlocal关键字。
b) 面试题:
a = 10
def test():
a += 1
print(a)
test()
解释:a += 1相当于a = a + 1,按照赋值运算符的规则是先计算右边的a+1。但是,Python的规则是,如果在函数内部要修改一个变量,那么这个变量需要是内部变量,除非你用global声明了它是外部变量。很明显,我们没有在函数内部定义变量a,所以会弹出局部变量在未定义之前就引用的错误。
name ='jack'
def f1():
print(name)
def f2():
name = 'eric'
f1()
f2() #结果是‘jack’!
解释:Python函数的作用域取决于其函数代码块在整体代码中的位置,而不是调用时机的位置。调用f1的时候,会去f1函数的定义体查找,对于f1函数,它的外部是name ='jack',而不是name = 'eric'。
再看下面的例子,f2函数返回了f1函数:
name = 'jack'
def f2():
name = 'eric'
return f1
def f1():
print(name)
ret = f2()
ret()
仔细回想前面的例子,其实这里有异曲同工之妙,所以结果还是‘jack’。
二. range()函数
a) test1: 循环变量1-100
for i in range(10):
print(i)
注意:range会遍历从0到参数减1的数字
Test2:也可以指定遍历的区间:
for i in range(1, 12):
print(i)
会遍历从1到11的数字,左闭右开
Test3:还可以指定步长,就像切片一样
for i in range(1, 12, 2):
print(i)
test3:更多的时候是结合range()和len()函数,遍历一个序列的索引
a = ['Google', 'Baidu', 'Huawei', 'Taobao', 'QQ']
for i in range(len(a)):
print(i, a[i])
千锋郑州Python培训课程还有严格、科学、负责的教学就业管理制度,班主任、职业规划师全程跟班,把握每位学员的学习状态,并有专业的职业素养课和就业指导课,确保教学及就业质量。还有大量的免费Python视频教程帮助学员快速学习,更可以免费加入千锋开发者联盟,为会员提供免费技术支持及终身就业服务,免费参加千锋举办的各类技术沙龙和活动!
相关推荐HOT
更多>>大数据培训学习什么,你了解多少
大数据培训学习什么?你了解多少?随着互联网技术的不断发展,大数据技术开始走进人们的视野,并成为现阶段吃香的技术能力之一。那么熟练掌握大...详情>>
2023-03-16 15:16:01云计算培训怎么样?可靠吗
云计算培训怎么样?可靠吗?靠不靠谱要看你什么要求了,因人而异。但如果你是想通过培训机构快速掌握好技能,然后进入行业,这个一般都没有问题...详情>>
2023-03-07 14:51:00java编程工资多少?主要学哪些内容
java编程工资多少?主要学哪些内容?java程序员的月收入在6000-20000不等,在一线城市有工作经验的java程序员的薪资收入会高一些,在二三线城市...详情>>
2023-02-24 14:56:07it工程培训机构,云计算难学吗
下面给小伙伴们列举一个学习大纲参考: 第一阶段: 零基础入门 1、计算机基础 2、Raid设置与网络服务基础 3、网络基础 第...详情>>
2022-12-01 17:48:04