名称空间与作用域
(1)名称空间(namespaces)
用来存放名字的地方是对栈区的划分
有了名称空间,就可在栈区中放相同的名字
1.1、内置名称空间
存放的名字:是Python解释器内置的名字
"""
交互模式下输入:
>>> input
<built-in function input>
>>> print
<built-in function print>
>>>
"""
存活周期:Python解释器启动则产生,Python解释器关闭则销毁
1.2、全局名称空间
存放的名字:只要不是函数内定义的,也不是内置的,剩下的都是全局名名称空间
存活周期:Python文件执行则产生,Python文件运行完毕则销毁
1.3、局部名称空间
存放的名字:在调用函数时,运行函数体代码过程中产生的函数内的名字
存活周期:在函数调用时存活,函数调用完毕后则销毁
1.4、名称空间加载顺序
"""
内置名称空间》全局名称空间》局部名称空间
"""
1.5、销毁顺序
"""
局部名称空间》全局名称空间》内置名称空间
"""
1.6、名字查找优先级
"""当前所在的位置向上一层一层查找"""
"""
如果当前在局部名称空间:
局部名称空间》全局名称空间》内置名称空间
如果当前在全局名称空间:
全局名称空间》内置名称空间
"""
示范
示范1:
def func():
print(x)
x=111
func()
"""结果如下"""
111
示范2:名称空间的‘’嵌套‘’关系是以函数定义阶段为准,与调用位置无关
x=1
def func():
print(x)
def foo():
x=222
func()
foo()
"""结果如下"""
1
示范3:函数嵌套定义
input=111
def f1():
input=222
def f2():
input=333
print(input)
f2()
f1()
示范4:
x=111
def fun():
print(x)
x=222
fun()
"""结果报错"""
(2)作用域
作用范围
2.1、 全局作用域
全局作用域:内置名称空间。全局名称空间
"""
全局存活
全局有效:被所有函数共享
"""
2.2、局部作用域
局部作用域:局部名称空间的名字
"""
临时存活
局部有效
"""
2.3、作用域与名字查找的优先级
在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,没有找到,再去全局作用域查找:先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常
x=100 #全局作用域的名字x
def foo():
x=300 #局部作用域的名字x
print(x) #在局部找x
foo()#结果为300
在全局作用域查找名字时,起始位置便是全局作用域,所以先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常
x=100
def foo():
x=300 #在函数调用时产生局部作用域的名字x
foo()
print(x) #在全局找x,结果为100
在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,若要在函数内修改全局名称空间中名字的值,当值为不可变类型时,则需要用到global关键字
x=1
def foo():
global x #声明x为全局名称空间的名字
x=2
foo()
print(x) #结果为2
当实参的值为可变类型时,函数体内对该值的修改将直接反应到原值
num_list=[1,2,3]
def foo(nums):
nums.append(5)
foo(num_list)
print(num_list)
#结果为
[1, 2, 3, 5]
对于嵌套多层的函数,使用nonlocal关键字可以将名字声明为来自外部嵌套函数定义的作用域(非全局)
def f1():
x=2
def f2():
nonlocal x
x=3
f2() #调用f2(),修改f1作用域中名字x的值
print(x) #在f1作用域查看x
f1()
#结果
3
nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常。
(3)函数全局变量
- 局部变量:就是在函数内部定义的变量【作用域仅仅局限在函数的内部】
- 不同的函数,可以定义相同的局部变量,但是各自用各自的 不会产生影响.
- 局部变量的作用:为了临时的保存数据,需要在函数中定义来进行存储.
- 当全局变量和局部变量出现重复定义的时候,程序会优先执行函数定义的内部变量.
- 如果函数内部要想对全局变量进行修改,必须使用global关键字进行声明.
# pro='信息安全'#全局变量
# name='周润发'
# def printInfo():
# name='刘德华'#局部变量
# print('{}'.format(name))
#
# def TestMethod():
# name='peter'#局部变量
# print(name)
# printInfo()
# TestMethod()
#
#
# def message():
# print(pro)
#
# message()
#
pro='123'
def changGlobal():
global pro
pro='456'
print(pro)
changGlobal()
标签:作用域,print,python,名称,空间,全局,def From: https://www.cnblogs.com/saury/p/16739202.html