前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >技巧(一)、Scope and Namespace

技巧(一)、Scope and Namespace

作者头像
狼啸风云
发布于 2023-10-07 07:07:51
发布于 2023-10-07 07:07:51
23400
代码可运行
举报
运行总次数:0
代码可运行

1,基础概念

1.1 命名空间(namespace)  

命名空间是名字和对象的映射。也就是可以把一个namespace理解为一个字典,实际上很多当前的Python实现namespace就是用的字典。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

那么哪些可以是一个namespace呢,比如python的built-in names(包括内置函数,内置常量,内置类型);

一个模块的global names(这个模块定义的函数,类,变量);

一个函数的所有local names;

还有一个类对象的所有属性(数据成员,成员函数)都组成一个命名空间;

命名空间都是有创建时间和生存期的。

对于python built-in names组成的命名空间,它在python解释器启动的时候被创建,在解释器退出的时候才被删除;

对于一个python模块的global namespace,它在这个module被import的时候创建,在解释器退出的时候退出;

对于一个函数的local namespace,它在函数每次被调用的时候创建,函数返回的时候被删除;

一个模块的引入,函数的调用,类的定义都会引入命名空间,函数中的再定义函数,类中的成员函数定义会在局部namespace中再次引入局部namespace。

1.2 作用域(scope)  

作用域是python程序(文本)的某一段或某些段,在这些地方,某个命名空间中的名字可以被直接引用。这个作用域就是这个命名空间的作用域。

一个Python程序的几个作用域:

  1. 最里面的局部作用域
  2. 外层函数的局部作用域
  3. 模块的全局作用域
  4. 包含python内置对象的最外层作用域
1.3 赋值(assignment)  

赋值操作不会拷贝,只是把名字和对象做一个绑定。也就是赋值语句是起一个绑定或重绑定的作用(bind or rebind)。函数调用的参数传递是赋值,不是拷贝。

2,global和nonlocal语句

global语句用来声明一系列变量,这些变量会引用到当前模块的全局命名空间的变量(module-level namespace),如果该变量没有定义,也会在全局空间中添加这个变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
global var1, var2

python2.7中还没有nonlocal语句。nonlocal语句用来声明一系列的变量,这个声明会从声明处从里到外的namespace去搜寻这个变量(the nearest enclosing scope),直到模块的全局域(不包括全局域),找到了则引用这个命名空间的这个名字和对象,若作赋值操作,则直接改变外层域中的这个名字的绑定。nonlocal语句声明的变量不会在当前scope的namespace字典中加入一个key-value对,如果在外层域中没有找到,则如下报错。

>>>SyntaxError: no binding for nonlocal 'spam' found

 一个nonlocal和global的测试例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def test():
    def do_local():
        spam = "local spam"
    def do_nonlocal():
        nonlocal spam    
        spam = "nonlocal spam"
    def do_global():
        global spam
        spam = "global spam"
    spam = "test spam"
    do_local()
    print("after local assignment:", spam)   #输出:test spam
    do_nonlocal()
    print("after nonlocal asssignment:", spam)   #输出:nonlocal spam
    do_global()
    print("after global assignment:", spam)    #输出:nonlocal spam

test()
print("in global scope:", spam)  #输出:global spam

第5行的语句:nonlocal spam 没有在函数do_nonlocal()的域中创建一个变量,而是去引用到了外层的,10行定义的spam。

第8行的global spam,在全局域中创建了一个name,9行将其绑定在字符串常量对象"global spam"上。

跟进一步测试nonlocal

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def test():
    def do_nonlocal():
        nonlocal spam
        def do_nonlocal2():
            nonlocal spam
            spam = "nonlocal2 spam"  #修改了test()中spam的绑定
        do_nonlocal2()
    spam = "test spam"
    do_nonlocal()
    print("after nonlocal2 asssignment:", spam)  #输出:nonlocal2 spam
test()

do_nonlocal2()中的spam引用的是其外面的二层,也就是test()函数域中的spam。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 作用域和命名空间
在介绍类之前,我首先要告诉你一些Python的作用域规则。类定义对命名空间有一些巧妙的技巧,你需要知道作用域和命名空间如何工作才能完全理解正在发生的事情。顺便说一下,关于这个主题的知识对任何高级Python程序员都很有用。
py3study
2020/01/16
7240
Python的抽象魔法--类
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性(attribute)和方法(method)。对象是类的实例(instance)。 类属性:类属性在整个实例化的对象中是公用的。类属性定义在类中且在函数体之外。类属性通常不作为实例使用。 局部变量:定义在方法中的变量,只作用于当前实例的类。 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
爱编程的小明
2022/09/05
3930
Python的抽象魔法--类
python高阶教程-命名空间与作用域
本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/zhuanlan-senior-python-2/
羽翰尘
2019/11/20
4340
Python与家国天下
导读:Python猫是一只喵星来客,它爱地球的一切,特别爱优雅而无所不能的 Python。我是它的人类朋友豌豆花下猫,被授权润色与发表它的文章。如果你是第一次看到这个系列文章,那我强烈建议,请先看看它写的前几篇文章(链接见文末),相信你一定会爱上这只神秘的哲学+极客猫的。不多说啦,一起来享用今天的“思想盛宴”吧!
Python猫
2019/04/09
5400
Python与家国天下
由一个例子到python的名字空间
可以正常输出结果: 并且需要注意,在func2使用x变量之前的名字空间就已经有了'x':1.
py3study
2020/01/03
4070
Python学习笔记:命名空间和作用域
在Python中,任何“东西”都是一个对象。当我们赋值整数给变量时,例如x = 1,我们告诉Python在引用x时,意味着Python指向整数类型对象1,以便对数值计算或其他方法使用值1。
fanjy
2019/07/19
9130
Python学习笔记:命名空间和作用域
详解Python变量作用域
本文暂时不讨论类定义中的变量(成员)作用域,改天可能会单独成文介绍。 变量作用域总起来说可以这么理解:1)在函数内如果只引用某个变量的值而没有为其赋新值,该变量为(隐式的)全局变量;2)如果在函数内某条代码有为变量赋值的操作,该变量从此之后就被认为是(隐式的)局部变量,除非在函数内该代码之前显式地用关键字global进行了声明。 >>> def demo(): global x #声明或创建全局变量 x = 3 #修改全局变量的值 y =4 #局部变量 print(x, y) >>> x =
Python小屋屋主
2018/04/16
1.5K0
Python基础之:Python中的类
class是面向对象编程的一个非常重要的概念,python中也有class,并且支持面向对象编程的所有标准特性:继承,多态等。
程序那些事
2021/04/02
7550
Python基础之:Python中的类
class是面向对象编程的一个非常重要的概念,python中也有class,并且支持面向对象编程的所有标准特性:继承,多态等。
程序员鑫港
2022/01/05
7990
python基础教程:作用域和命名空间
命名空间和作用域的概念我们之前也提到过,比如内置函数globals(),函数中变量的作用域,模块使用的import等等。这些可能让我们对这两个概念有了大致的理解。本节再详细探讨一下。
一墨编程学习
2019/05/14
5970
python基础教程:作用域和命名空间
最易写出bug?Python命名空间和作用域介绍
简单的说,命名空间就是一种“名称-对象”的映射表,使得我们可以通过对象指定的名称来访问它们。
MeteoAI
2019/08/12
7410
最易写出bug?Python命名空间和作用域介绍
Python 语法基础
自从对着官方文档对着 ipython 敲了一遍一天学完了 Python 的语法之后,我觉得我行了。于是屁颠屁颠地跑去写项目,结果显而易见,开发之路可谓寸步难行,一停下来就光速遗忘。
浪漫主义狗
2023/09/04
6190
python3--函数进阶
TypeError: func() missing 4 required keyword-only arguments: 'a', 'b', 'c', and 'd'
py3study
2018/08/02
5050
Python 基础(十八):命名空间 & 作用域
命名空间(namespace)是名称到对象的映射,当前大部分命名空间都是通过 Python 字典来实现的,它的主要作用是避免项目中的名字冲突,每一个命名空间都是相对独立的,在不同的命名空间中可以同名,在相同的命名空间中不可以同名。
Python小二
2020/08/18
6030
Python 基础(十八):命名空间 & 作用域
2.Python函数的进阶
昨天我们从形参角度,讲了两种参数,一个是位置参数,位置参数主要是实参与形参从左至右一一对应,一个是默认值参数,默认值参数,如果实参不传参,则形参使用默认参数。那么无论是位置参数,还是默认参数,函数调用时传入多少实参,我必须写等数量的形参去对应接收, 如果不这样,那么就会报错:
changxin7
2019/09/10
3060
2.Python函数的进阶
Python学习 :函数
是指可重复使用的程序片段。它们允许你为某个代码块赋予名字,允许你通过这一特殊的名字在你的程序任何地方来运行代码块,并可重复任何次数。这就是调用(Calling)函数。
py3study
2020/01/19
4510
Python基础教程
星号只在 定义函数(允许使用不定数目的参数)或者 调用(“分割”字典或者序列)时才有用。
py3study
2020/01/03
7770
撩课-Python-每天5道面试题-第8
一. 解释下什么是闭包? 有怎样的场景作用? 概念 在函数嵌套的前提下 内层函数引用了外层函数的变量(包括参数) 外层函数, 又把 内层函数 当做返回值进行返回 这个内层函数+所引用的外层变量, 称为
py3study
2020/01/20
3070
深入理解Python变量作用域与函数闭包
1、引言 最近遇到一个求最长回文子串的题目,于是,我写了如下的代码: class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ if len(s) < 2: return s maxlen = 0 res = ''
石晓文
2018/04/11
1.7K0
Python3 | 练气期,函数创建、参数传递、作用域!
描述:上一章,我们学习了Python3编程中最基本而得流程控制语句,相信大家在作者的实践下也已经掌握了相关关键字了吧,这一章我们一起学习Python3编程入门中函数定义、函数调用、函数参数(传递、类型),匿名函数、递归函数。内嵌函数和闭包、装饰器函数,以及命名空间作用域的讲解,它也是Python编程中最基础且常用的部分,所以说也是需要我们掌握的。
全栈工程师修炼指南
2024/07/29
650
Python3 | 练气期,函数创建、参数传递、作用域!
相关推荐
Python 作用域和命名空间
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验