python变量与作用域
1.变量的概念
变量由两部分组成:变量名和变量值。变量值是存放在内存中的,变量的数据类型决定了其值在内存中的存放方式;变量名只是一个指向变量值所在内存空间地址的引用而已。
python中的变量回收机制:
变量的值存放在内存空间中
内存空间是有地址的(门牌号)
变量名是对其变量值所在内存空间地址的引用
Python解释器对内存地址引用次数是有记数的
Python解释器会定期将引用次数为0的内存地址清空--释放
函数名也是变量,函数体就是这个变量的值:
calc=lambdax:x*3
2.作用域的概念
Python的作用域一共有4种,分别是:
L(Local)局部作用域
E(Enclosing)闭包函数外的函数中
G(Global)全局作用域
B(Built-in)内建作用域
查找变量的值时以L-->E-->G-->B的顺序进行查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
说明:Python除了def/class/lambda外,其他如:if/elif/else/try/exceptfor/while并不能改变其作用域。定义在它们之内的变量,外部还是可以访问。
3.全局变量与局部变量
一个程序中的变量是有作用域(scope)的,作用域的大小会限制变量可访问的范围。Python中的变量根据作用域范围的大小不同可以分为:全局变量和局部变量。顾名思义,全局变量表示变量在全局范围内都可以被访问,而局部变量只能在一个很小的范围内生效。这就好比国家主席与各省的省长:在全国范围内国家主席都是同一个人,因此国家主席就是个全局变量;而各省的省长只能在某个省内生效,河北省省长是一个人,河南省省长又是另外一个人,因此省长就是个局部变量。对于Python编程语言而言,定义在一个函数内部的变量就是一个局部变量,局部变量只能在其被声明的函数内访问;定义在函数外部的变量就是全局变量,全局变量可以在整个程序范围内访问。
来看个示例:
#!/usr/bin/envpython
#-*-encoding:utf-8-*-
name='Tom'
deffunc1():
age=10
print(name)
print(age)
deffunc2():
sex='F'
print(name)
print(sex)
print(name)
func1()
func2()
输出结果:
Tom
Tom
10
Tom
F
上面的示例中,name是一个全局变量,因此它在程序的任何地方都可以被访问;而func1函数中的age变量和func2函数中的sex变量都是局部变量,因此它们只能在各自定义的函数中被访问。
问题1:如果在函数内定义一个与全局变量同名的变量会怎样?
#!/usr/bin/envpython
#-*-encoding:utf-8-*-
name='Tom'
deffunc3():
name='Jerry'
print(name)
print(name)
func3()
print(name)
输出结果:
Tom
Jerry
Tom
通过上面两个示例的输出结果我们可以得出这样的结论:
函数内引用一个变量时,会先查找该函数内部是否存在这样一个局部变量,如果存在则直接引用该局部变量,否则将查找并引用全局变量;
对局部变量的赋值并不会对全局变量产生什么影响,因为它们本来就是两个不相关的变量。
问题2:如果想在上面示例中的函数内部为全局变量重新赋值怎么办?
可以在函数内部通过global关键字声明该局部变量就是全局变量:
#!/usr/bin/envpython
#-*-encoding:utf-8-*-
name='Tom'
deffunc4():
globalname
name='Jerry'
print(name)
print(name)
func4()
print(name)
输出结果:
Tom
Jerry
Jerry
可见全局name的值的确被func4函数内部的操作改变了。
问题3:能不能将全局变量通过传参的方式传递给函数,然后在函数内部对全局变量做修改呢?
变量值的改变通常有两种方式:(1)重新赋值(2)改变原有值。要想在函数内部通过重新赋值来改变全局变量的值,则只能通过上面介绍的使用global关键字来完成,通过传参是无法实现的。而要想在函数内部改变全局变量的原有值的属性就要看该参数是值传递还是引用传递了,如果是引用传递则可以在函数内部对全局变量的值进行修改,如果是值传递则不可以实现。具体请看下面的分析。
以上内容为大家介绍了python变量与作用域,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。
相关推荐HOT
更多>>Python企业应用的优缺点
Python是软件开发领域一朵诱人的奇葩:人们经常把Python看作是一种起到缝合作用的严格脚本语言,不过却很少有人意识到Python已经足够强大到应用...详情>>
2023-11-11 21:01:20Python 之什么是类,什么是对象?
类即类别、种类,是面向对象设计最重要的概念,从一小节我们得知对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体。那么...详情>>
2023-11-11 18:20:34Python 爬虫之pyspider
pyspider是一个支持任务监控、项目管理、多种数据库,具有WebUI的爬虫框架,它采用Python语言编写,分布式架构。详细特性如下:拥有Web脚本编辑...详情>>
2023-11-11 17:49:48python RSA加密算法过程
1,随机选取两个质数p和q2,计算n=pq3,选取一个与Ø(n)互质的小奇数e,Ø(n)=(p-1)(q-1)4,对模Ø(n),计算e的乘法逆元d,即满足(e*d)modØ(n)...详情>>
2023-11-11 17:20:50