问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

函数的嵌套、名称空间和作用域详解

创作时间:
作者:
@小白创作中心

函数的嵌套、名称空间和作用域详解

引用
1
来源
1.
https://www.xin3721.com/PythonSample/python21979.html

函数调用的三种形式

函数调用是Python编程中的基本操作,主要有以下三种形式:

def func():
    print('from func')
func()  # 第一种函数名加括号

def max_2(x,y):
    if x > y:
        return x
    else:
        return y
res = max_2(10,3)
print(res)  # 表达式去调用

def max_2(x,y):
    if x > y:
        return x
    else:
        return y
res = max_2(10,max(2,3))
print(res)  # 函数作为参数的形式

函数的嵌套

函数嵌套是指在一个函数内部定义另一个函数。这种结构可以提高代码的组织性和封装性。

def func1():
    print('from func1')

def func2():
    func1()
    print('from func2')

func2()
# 输出:
# from func1
# from func2

函数的名称空间

什么是名称空间?

名称空间就是用来存放名字的空间。

名称空间的作用

如果你想访问一个变量值,必须先访问对应的名称空间,拿到对应的内存地址的绑定关系。

名称空间的分类

  1. 内置名称空间:Python解释器启动时就可用的名字,如printlenmaxinput等。
  2. 全局名称空间:存放文件级别的名字,是在程序从上到下被执行的过程中依次加载进内存的,放置了所有变量名和函数名。
  3. 局部名称空间:在函数内部定义的所有名字,注意的是当调用函数的时候,才会产生这个名称空间,随着函数执行的结束,命名空间就消失。

生命周期

  1. 内置名称空间:在Python解释器启动时生效,关闭Python解释器时失效。
  2. 全局名称空间:当你启动这个py文件时生效,当前页面代码执行结束之后失效。
  3. 局部名称空间:当你调用函数时生效,函数一旦调用完毕就失效。

名称空间的使用范围

  1. 在局部可以使用全局名称和内置名称
x = 1
def func():
    print(x)  # 使用了全局名称x,以及使用了内置名称print
func()
# 输出:1
  1. 在全局可以使用内置名称空间,但不可使用局部名称空间
x = 1
def func():
    a = 1
    print(x)  # 使用了全局名称x,以及使用了内置名称print
func()
print(a)  # NameError: name 'a' is not defined
# 此时a已经消失了
  1. 在内置不可使用局部和全局的名称
x = 1
def func():
    x = 2
    print(x)  # 使用了局部名称x
    def func1():
        x = 3  # 自己有就用我自己的,没有就去找上一级,如果上一级都没去找内置,如果内置都没有那就报错
        print(x)
    func1()
func()
# 输出:
# 2
# 3

x = 1
def func():
    x = 2
    print(x)  # 使用了局部名称x
    def func1():
        print(x)  # 自己没有就用上一级的x=2
    func1()
func()
# 输出:
# 2
# 2

x = 1
def func():
    print(x)
    def func1():
        print(x)  # 自己没有就用上一级的,上一级也没有就再找上一级
    func1()
func()
# 输出:
# 1
# 1
x = 1
def index(arg = x):  # 默认参数,此时已经将x=1赋值给arg
    print(x)
    print(arg)
x = 2
index()
# 输出:
# 2
# 1

作用域的分类

  1. 全局作用域:全局可以调用的名字就存在于全局作用域,包括内置名称空间和全局名称空间。
  2. 局部作用域:局部可以调用的名字就存放于局部作用域,即局部名称空间。

对于不可变类型,在局部可以查看全局作用域中的变量。但是不能直接修改,如果想要修改,需要在程序中添加一个global变量,那么这个变量在局部的所有操作将对全局的变量有效。

x = 1
def func():
    global x  # 声明此时的x就是全局变量
    x = 2
    print(x)
func()
print(x)
# 输出:
# 2
# 2

# 在局部修改外部函数的变量
def func():
    x = 1
    def func1():
        nonlocal x
        x = 3
    func1()
    print(x)  # 通过nonlocal就可以修改离他当前最近的一个外层变量的值,此时不会打印x=1,会打印x=3
func()
# 输出:3
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号