函数的名称空间与作用域

书接上回,上次我们讲解了函数的分类与函数参数,这次将对函数的名称空间与作用域做详细介绍

一、名称空间

函数名称空间是指变量和函数的命名空间,它是一个存储变量和函数名称的容器。在函数中定义的变量和函数都包含在函数名称空间中,并且只能在该函数中访问。在Python中,每个函数都有自己的局部名称空间。当函数被调用时,它创建了一个新的局部名称空间,并在该空间中执行函数代码。当函数完成时,该名称空间将被销毁。

简单来说名称空间就是存放变量名和变量值的地方

1.1名称空间的分类

1.内置空间的名称

Python中的内置名称空间包含了Python解释器内置的函数和变量。这些函数和变量可以在任何地方直接访问,不需要导入任何模块。比如:print、input、len等

2.全局的名称空间

在Python中,顶格编写的变量名等都是全局名称空间,如下:

name = 'A_biao'
def index()
	pass
if x == 1:
	pass
for i in range(10)
	pass

3.局部空间名称

伴随函数的调用/结束而临时产生/回收,函数的形参、函数内定义的名字都会被存放于该名称空间中
一般来说存在于函数内部的都是局部

def index()
	a=1
	b=2

全局变量:在函数外部的变量都是全局变量

局部变量:在函数内部的变量都是局部变量

4.名字的查找顺序

1.如果在局部的时候:局部>>>全局>>>内置

2.如果在全局的时候:全局>>>内置

5.局部空间名称的嵌套

def f1():
    x = 222
    print('f1')
    def f2():
        print('f2')
        x = 333
        def f3():
            print('f3')
            x = 444
            def f4():
                x = 555
                print(x)
            f4()
        f3()
    f2()
f1()

1.2名称空间的作用域

域:范围

作用域:变量的作用范围

  1. 内置名称空间
    在全局的任意位置都能够使用
  2. 全局名称空间
    在全局的任意位置任意时间都能够使用
  3. 局部名称空间
    一般情况只能够在局部使用

二、global和nonlocal的使用

1. 在Python中,如果在函数内部需要改变全局作用域中的变量,需要使用global关键字。

x = 10
def index():
	global x # 声明这个x用的是全局的x
	x = 20 # 在局部修改全局x的值为20
	print(x)
index()
print(x)

如果你想在局部修改全局的变量:
1. 如果你修改的是不可变的类型,需要global关键字的声明
2. 如果你修改的是可变类型的,无需使用global关键字声明

2. 在Python中,如果在一个嵌套函数中需要修改嵌套作用域中的变量,但不想将该变量声明为全局变量,可以使用nonlocal关键字。

def outer():
    x = 666

    def inner():
        nonlocal x
        x = 999

    inner()
    print(x)  # 999


outer()

如果你想在内部的局部修改外部的局部:
1. 如果你修改的是不可变的类型,需要nonlocal关键字的声明
2. 如果你修改的是可变类型的,无需使用nonlocal关键字声明

相关推荐

  1. 函数名称空间作用

    2023-12-14 22:58:02       60 阅读
  2. 名称空间作用

    2023-12-14 22:58:02       61 阅读
  3. 5.2 Python 名称空间作用

    2023-12-14 22:58:02       29 阅读
  4. Python中名称空间作用

    2023-12-14 22:58:02       59 阅读
  5. 函数作用

    2023-12-14 22:58:02       38 阅读
  6. 名称空间函数对象

    2023-12-14 22:58:02       55 阅读
  7. Python函数名称空间及相关函数知识

    2023-12-14 22:58:02       56 阅读
  8. Kotlin 中作用函数

    2023-12-14 22:58:02       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-14 22:58:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-14 22:58:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-14 22:58:02       82 阅读
  4. Python语言-面向对象

    2023-12-14 22:58:02       91 阅读

热门阅读

  1. 深度学习之模型层

    2023-12-14 22:58:02       60 阅读