首页 > 其他分享 >1.7 - 命名空间与作用域

1.7 - 命名空间与作用域

时间:2024-01-14 19:57:49浏览次数:31  
标签:1.7 函数 作用域 空间 print 命名 locals

1.7.1 命名空间

  命名空间(NameSpace)是一个从名称到对象的映射。大部分命名空间由 字典 实现,内置命名空间由 builtins 模块实现。命名空间之间是独立的,避免了命名冲突。

 

1.7.2 命名空间的分类

  1)内置命名空间

    包含所有Python内置对象的名称,在 解释器启动时 创建,持续到解释器终止。被所有的Python文件所共享。

  2)全局命名空间

    一个.py 文件即是一个python模块,每个模块都有一个各自的全局命名空间。记录了模块的 全局变量、类、函数、导入的其它模块 等。在 模块被读入时 创建,持续到解释器退出。

  3)局部命名空间

    记录了函数的 变量的参数 。在 函数被调用时 创建,持续到函数调用结束。

  命名空间的查找顺序默认优先级:局部命名空间 > 全局命名空间 > 内置命名空间 

 

1.7.3 exel()函数和eval()函数【都可以执行字符串形式的 python 代码】

  eval(expression [,  globals [, locals ]]);只能接收一个表达式;返回表达式的结果;

  exec(object [, globals [,locals ]]);可以接收多个表达式组成的代码块;无返回值,返回None;

  注:globals 和 locals 参数为字典,指代 表达式的全局命名空间和局部命名空间,并且如果函数包含了globals和locals参数,表达式执行的时候只能从参数globals 和 locals 的命名空间中取值

    如果locals参数没有传递而只传递了globals参数,那么 locals 取和globals相同的值。

# 验证eval函数

a = 1
b = 2

def fun1():
  a = 3
  
  print(eval("a+b"))  # 5
  print(eval("a+b", {'a':4, 'b':5})) # 9
  print(eval("a+b", {'a':4, 'b':5}, {'a':6, 'x':7})) # 11
  print(eval("a+b", {'a':6, 'x':7}, {'a':8, 'y':9})) # 命名空间找不到变量b,报错。

 

1.7.4 作用域

  python程序可以直接访问的命名空间的正文区域。

  作用域分类:局部作用域(Local) > 闭包函数外的函数中(Enclosing) > 全局作用域(Global) > 内置作用域(Built-in) ;当前作用域内找不到变量值的时候会自动向下一个作用域寻值。

  只有模块(module)、类(class)以及函数(def、lambda)才会引入新的作用域。案例如下:

# if 、while等分支不会引入新的作用域

a = 123

if  a == 123:
  a = 456
  print(a) # 456

print(a) # 456

 

1.7.5 人为指定变量的作用域

1 # 下面代码会报错,分析:表达式 a+1 在执行的时候会发生:变量a在执行之前引用。
2 
3 def  fun2():
4   a = a + 1
5   print(a)
6 
7 a = 123
8 fun2() # 
9 print(a) 

分析: 8th 调用fun2函数,会报错:在fun2函数中,将表达式 a+1 赋值给 a,语法检查器检查到 局部命名空间中有定义变量a,所以 在执行表达式的时候,不会去访问全局变量a,而在局部作用域中,变    量a的赋值又是在表达式执行之后,所以会报 “变量a在赋值之前引用” 错误。

解决

# 解决 
def  fun2():
  global  a    # 通过global关键字指定局部作用内的a全部使用 全局变量
  a = a + 1
  print(a)

a = 123
fun2() 
print(a) 

 

global关键字和 nonlocal关键字:

如上示例:global强制使用全部变量;nonlocal强制使用闭包函数外函数内变量!!!

 

结尾小甜点:

def outer():
  lst = [1,2]

  def inner():
    res = lst.append(3)
    lst = lst.append(3)
    print(lst,  res)     #  None,  None

outer()

为啥会输出两个None?因为append函数没有返回值!

 

标签:1.7,函数,作用域,空间,print,命名,locals
From: https://www.cnblogs.com/zhangzhenw/p/17963886

相关文章

  • 函数作用域
    '''定义的名字可以使用区域在函数外面定义的名字都属于全局名字在函数里面定义的名字都属于局部名字局部作用域和全局作用域Python自带名字(函数名和变量名)内置区域函数外面定义的名字:区局区域函数里面定义的名字:局部区域'''#a=1#定义全局变量deffunc():a=1#定义局......
  • 10-函数进阶-作用域
    '''定义的名字可以使用的区域在函数外面定义的名字,都属于全局名字在函数里面定义的名字,都属于局部名字局部作用域:全局作用域:python自带名字(函数名和变量名)内置区域函数外面定义的名字:全局区域函数里面定义的变量:局部区域'''a=1#全局变量deff():a=2#局部......
  • 2024.1.7做题纪要
    P4093[HEOI2016/TJOI2016]序列不会写,褐的题解。设\(dp_i\)表示以\(i\)结尾的最长子序列,维护就行了。教员#include<bits/stdc++.h>intN,M;intnumber[110000],min[110000],max[110000];classBinary_Indexed_Tree{#definelowbit(x)(x&(-x))publ......
  • 软件测试/测试开发全日制|Pytest测试框架Fixture作用域详解
    前言Pytest的fixtrue是存在作用域的,比如作用域为函数级别,那么没执行一条用例,就会重新执行一次fixtrue,如果是类级别,那么多个类执行时会在去执行fixture。fixture的作用域有5个,分别是:function,class,module,package,session。有了这些作用域我们可以不用重复的去执行fixture,从......
  • Linux网卡名称命名
    CentOS7服务器,默认网卡名为ifcfg-eno16777736,如果我们想改成ifcfg-eth0,使用如下步骤即可:(1)编辑/etc/sysconfig/grub文件,命令为vi/etc/sysconfig/grub,在倒数第二行quiet后加入如下代码,并如图所示:(2)执行命令grub2-mkconfig-o/boot/grub2/grub.cfg,生成新的grub.cfg文件,如图所示......
  • js 执行上下文与作用域
    执行上下文(以下简称“上下文”)的概念在JavaScript中是颇为重要的。变量或函数的上下文决定了它们可以访问哪些数据,以及它们的行为。每个上下文都有一个关联的变量对象(variableobject),而这个上下文中定义的所有变量和函数都存在于这个对象上。全局上下文是最外层的上下文。......
  • 为什么a标签无法下载,无法重命名?
    《1》a标签的href有很大的关系,href属性的地址必须是同源URL,否则,download就会不起作用。1.同源URL会进行下载操作2.非同源URL会进行导航操作3.非同源的资源仍需要进行下载,那么可以将其转换为blob:URL形式《2》a标签的download属性是HTML5新增的属性,它可......
  • shell命令mac怎么批量重命名某个目录下的文件
    在Mac上批量重命名文件很简单,你可以使用“终端”应用程序或者Finder中的“批量重命名”功能。下面是两种方法:使用终端:打开终端应用程序。使用cd命令切换到目标目录,例如:cd/路径/到/你的/目标目录使用mv命令进行批量重命名,例如:forfilein*;domv"$file""新名称${file##*_}";do......
  • QRCoder1.4.3生成二维码,不依赖System.Drawing,解决"未能找到类型或命名空间名QRCode","
    生成二维码1(简单)包引用:<PackageReferenceInclude="QRCoder"Version="1.4.3"/>usingQRCoder;///<summary>///生成二维码///</summary>///<paramname="data">escape后的数据,防止中文等特殊字符引起问题</param>///<par......
  • 软件测试/测试开发/全日制|Pytest都有哪些命名规则?
    前言在使用Pytest进行测试时,良好的命名规范是编写清晰、易读和可维护的测试用例的重要组成部分。规范的命名使得测试用例的意图更加明确,便于团队成员理解和维护。本文就来给大家介绍一下pytest的命名规范。Pytest命名规范测试文件命名测试脚本文件为python文件,此外文件名命名规则为......