首页 > 其他分享 >12. 函数的名称空间与作用域

12. 函数的名称空间与作用域

时间:2024-07-29 23:29:31浏览次数:9  
标签:12 函数 作用域 age 名称 空间 全局

1. 名称空间

1.1 概念

名称空间是存放变量名与变量值映射关系的地方

1.2 分类

1.2.1 内置名称空间

Python解释器运行而产生的名称空间,如def、if、else、len

Python解释器运行---产生

Python解释器关闭---释放

1.2.2 全局名称空间

在python文件中编写的代码运行产生的名字都会存到全局名称空间(函数体代码之外的)

name = 'LeoMessi'  # 变量名name存入全局名称空间

def login():  # 函数名login存入全局名称空间
    pass

if True:
    a = 111  # 变量名a存入全局名称空间
for i in range(10):  # 变量名i存入全局名称空间    
    pass
while True:
    b = 222  # 变量名b存入全局名称空间

python文件开始运行 产生

python文件运行结束 释放

1.2.3 局部名称空间

函数体代码运行产生的都是局部名称空间

def register():
    name = 'ronaldo'  # name存入局部名称空间

函数体代码开始运行  产生

函数体代码运行结束  释放

1.3 名称空间的查找顺序

在查找名字的时候,一定要先搞清楚当前在哪个空间

1. 如果在局部名称空间

   局部名称空间————>  全局名称空间————>  内置名称空间

2. 如果在全局名称空间

  全局名称空间————>  内置名称空间

  (只能向外层不能向里层)

3.代码执行顺序

# 局部名称空间之间如果不是嵌套关系,那么互不干涉
def f1():
    name = 'LeoMessi'
def f2():
    age = 35
    print(name)  # 报错not defined
f1()
f2()

 2. 作用域

2.1 概念

作用域就是名称空间能够作用的范围,即变量名和变量值可以被访问的范围(变量名定义的位置和可以查找的位置)

2.2 分类

内置作用域  Built-in

Built-in(内置):解释器内置的变量,比如int, str等。
作用范围:所有模块(文件)
Python中没有块级作用域。
块级作用域:代码块中的变量,比如if、while、for后面的代码

程序任意阶段、任意位置均可使用(全局有效)

全局作用域  Global

Global(全局):一般模块文件顶层声明的变量具有全局作用域,从外部来看,模块的全局变量就是一个模块对象的属性,仅限于单个模块文件中。

作用范围:当前模块(文件)

 程序任意阶段、任意位置均可使用(全局有效)

 

局部作用域  Local

 

Local(局部变量):暂时的存在,依赖于创建该局部作用域的函数。

函数存在,则局部变量存在;函数不存在,则局部变量不存在。
作用范围:当前整个函数体范围

一般情况下,只在各自局部名称空间中有效(局部有效)

内嵌作用域  Enclosed

Enclosed(嵌套):一般是在函数中嵌套函数的时候,外层函数的变量作用域。
作用范围:闭包函数

 

 

2.3 作用域举例

内置作用域举例:

内建作用域里面提前加载好的  如os

import os

 

全局作用域举例:

自己在文件中定义的变量  

num = 123

 

局部作用域与内嵌作用域举例:

age = 18
# 局部作用域:定义在函数或者类内部的所有变量 # 内嵌作用域:在函数中嵌套函数的时候,外层函数的变量作用域。 def student(): age = 28 # 这里的age对student函数是局部作用域,对inner函数是内嵌作用域 print(f" student my age is {age}") def inner(): age = 38 # 这里的age为inner函数的局部作用域 print(f"inner my age is {age}") inner() student() print(f"global my age is {age}")

作用域的加载顺序:内置 -- 全局 -- 外层 -- 里层
查找循序 : 里层 -- 外层 -- 全局 -- 内置
 查找顺序遵循一个规则 LEGB 规则
L ---> local 局部的局部    最里层的函数
E ---> enclosed  内嵌,相对里层嵌套函数的外层
G ---> global 全局
B ---> built-in 内建

2.4 作用域声明

def func():
# 使用关键字来提 高当前变量的级别
# 局部修改全局不可变数据类型需要使用 global 提高当前作用域级别
global age
age = 19
age_ = age
print(f"func my age is {age}")
print(f"func my age_ is {age_}")
user_dict["age"] = 999

def inner():
# 提高内嵌函数作用域的变量级别
nonlocal age_ # no binding for nonlocal 'age' found
age_ = 38
print(f"inner my age_ is {age_}")
user_dict["age"] = 888

inner()
print(f"func my age_ is {age_}")


func()
print(f"global my age is {age}")
print(user_dict["age"])
# 字典是可变数据类型 ,大家对于修改字典的时候都是修改的同一块内容空间地址上面的值

# 【总结】
# 【1】名称空间就是存放变量名和变量值映射关系的地方 内建 全局 局部
# 【2】作用域就是变量名和变量值映射关系存放的范围 内建 全局 局部 内嵌
# 【3】如果局部修改全局不可变数据类型 用 global 提高当前作用域级别
# 如果是内嵌修改局部不可变数据类型 用nonlocal 提高作用域级别
# 内嵌作用域无法修改全局作用域中的不可变数据类型

 

标签:12,函数,作用域,age,名称,空间,全局
From: https://www.cnblogs.com/hbutmeng/p/18331203

相关文章

  • 一类初等函数下取点问题
    等差数列方向给\(N\)棵树,第\(i\)棵树的坐标是\(a_i\(-M\leqa_i\leqM)\)。可以花费\(b_i\)的代价将\(a_i\)修改为任意整数。询问\(a_1,a_2,\cdots,a_N\)构成等差数列需要的最小代价。思路:若\(a_1,a_2,\cdots,a_N\)是等差数列,则\((i,a_i)\)在二维空......
  • PostgreSQL 之 to_timestamp函数
    to_timestamp是PostgreSQL中的一个函数,用于将字符串或数字转换为时间戳。以下是关于to_timestamp的详细介绍:引入版本to_timestamp函数在PostgreSQL7.3版本中引入。语法to_timestamp有两种主要的用法:1.将字符串转换为时间戳to_timestamp(text,text)第一......
  • 【C语言】输入、输出函数知识、getchar()、putchar()、 scanf()、printf()
    函数的声明和定义1.1 函数声明1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。2.函数的声明一般出现在函数的使用之前。要满足先声明后使用。3.函数的声明一般要放在头文件中的。1.2C本身是不提供输入输出功能的,需要......
  • 函数的学习(一)
    1.定义C语言的函数是一段可被重复调用的代码块,可以执行特定的任务并返回一个值。每个函数由函数头、函数体和函数返回值组成。2.函数的分类C语言中的函数可以根据不同的特性进行分类,常见的分类如下:(1)标准函数(库函数):这些函数是C语言提供的预定义函数,可以直接在程序中调用。标......
  • 随机数函数 和 猜数字游戏(c语言初学者拔高)
    目录1.随机数的生成方法1.1rand()函数1.1.1函数原型1.1.2函数功能1.2srand()函数1.2.1函数原型1.2.2函数功能1.3time()函数1.2.1函数原型1.1.2函数功能1.4设置随机数的范围2.猜数字游戏2.1普通版:结构逻辑解析2.1.1程序代码2.1.2 细节答疑2.2拓......
  • Python 教程(六):函数式编程
    目录专栏列表前言函数定义参数返回值示例函数类型普通函数空函数匿名函数(Lambda函数)嵌套函数函数装饰器高阶函数函数参数位置参数默认参数可变位置参数可变关键字参数函数属性和方法`__name__``__doc__``func.__dict__``func.__defaults__``func.__annotations__`函......
  • JAVA小白学习日记Day12
    CSS定位1.定位属性 在CSS中,position属性用于指定元素在文档流中的定位方式。常用的取值包括:static:默认值,元素遵循正常的文档流布局,不受top、right、bottom、left属性的影响。relative:元素相对于其正常位置进行定位,通过top、right、bottom、left属性可以调整元素相......
  • JSP学生社团管理系统k2120(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文
    系统程序文件列表开题报告内容JSP学生社团管理系统开题报告一、课题背景与意义课题背景随着高等教育的普及和学生综合素质培养的重视,学生社团在高校中扮演着越来越重要的角色。它们不仅是学生锻炼能力、展示才华的平台,也是促进学生交流、丰富校园文化生活的重要途径。然而......
  • c/c++ 《仿函数》
    4STL-函数对象4.1函数对象4.1.1函数对象概念概念:重载函数调用操作符的类,其对象常称为函数对象函数对象使用重载的()时,行为类似函数调用,也叫仿函数本质:函数对象(仿函数)是一个类,不是一个函数4.1.2函数对象使用特点:函数对象在使用时,可以像普通函数那样调用,可以......
  • 函数 动态参数
    #固定参数+动态位置参数defmy_function(a,b,*args):print(a)print(b)print(args)my_function(1,'c',1,2,3,4,5,6)#输出#1#固定位第一个占位符#c#固定位第二个占位符#(1,2,3,4,5,6)#剩下的部分#可变关键词参数defmy_funciton2(a,b,......