什么是名称空间?

  比如下图的长方形代表内存,在这个内存里我要设置一个变量100,那么这个变量得有个门牌号,就叫他a吧,但其实变量不是这么存储的,他其实的存储方式是这样的,他会有一个名称空间,这个名称空间里面有一个表,他这个表里的内容是变量的名对应变量的内存地址这么一个关系,那么你定义一个变量b,那b也会有相应的内存地址,只要你定义变量,名称空间里就会多一组变量名对应他相应的内存地址,你定义以后,他会通过变量内存地址去找你相应的变量的值,他是这么存储的。

就是门牌号对应相应的内存地址。

对于这个表来说,他就是名称空间,也就说名称空间是存储变量名于他相对应的内存地址的关系的一个表。

什么是作用域?

Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。

函数定义了本地作用域,而模块定义的是全局作用域。

如果想要在函数内定义全局作用域,需要加上global修饰符。

名称空间又分为三种:

内置名称空间:python自带的,启动时就有的。如print、max、min。(ctrl+左键可以看到内置函数的代码)

全局名称空间:顶格写的变量。调用的时候才会产生全局名称空间。

局部:函数体内定义的变量

这三种有什么区别呢?

内置:print是python 的内置函数,函数即变量,那么我们定义一个函数,也就产生了相应的名称空间。print也是一个变量的名字,那么他内置的方法就是他的值(他的方法无非就是打印),他实现的方法也是用代码写出来的,来看一下print里面的代码,选中print,CTRL+鼠标左键。

全局:比如定格写的a = 10,我只要run,那么名称空间里就会有这个变量与他变量值的内存地址对应的关系。整个py文件他都是有效的。

不管是在函数体内调用这个a,还是别处调用,只要是这个py文件,我都能找的到这个变量a。

再看一下这个:

虽然a=5没有定格写,但是他只是做了条件判断,那么这个a也是属于全局名称空间。

局部:函数体内定义的变量

我们可以看到,我在外部调用的时候是找不到变量a的,由此可以得出,函数体内定义变量,是局部名称空间。

所以说print就是一个变量,他的方法就是他的value,所以像python自带的函数,就是内置名称空间。

什么时候有名称空间

在调用定义的变量的时候才有名称空间

python名称空间加载顺序

我们看一下下面这个函数

  我们要知道,pyhton执行代码是从上往下执行的,当我一运行这个函数,python解释器知道它函数了,它会去找可执行的代码,因此,这个函数体内代码会被略过,pyhton解释器找到f1(),知道这调用函数f1,它会在返回f1函数体内,它又找到了a=10,并且打印变量a,那么我们在调函数f1的时候产生了局部名称空间,那么我们定义的函数f2呢,它产生了名称空间吗?答案很简单,是没有的,因为函数f2并没有被调用。那么我想调用函数f2怎么调用呢?

这就涉及到了名称空间的访问顺序

内置 全局 局部

  看一下这个函数,我指调用了函数f1,它并没报错,调用f2也不会报错,只有调用f3的时候才会报错,因为f3函数体内打印x。而我并没有定义变量x,函数体内的变量产生的局部名称空间,因此,f3调用的变量x不会影响到函数f1和函数f2.

  由此可得出名称空间的加载顺序,python解释器一运行,首先加载的内置的,内置不加载的话,函数f1我们就调用不到了,更不用等到调用函数f3出错的时候,其次加载的是全局,我们再函数外部定义x=1的话,那么它会调用这个变量x=1。

最后才运行局部的,我们再在函数f1体内定义一个x=3,那么它会去调用这个x=3。

python名称空间访问顺序

局部 全局 内置

首先来说,我们调用函数f3的时候,它会先找函数f3体内定义的变量x=4,如果它没找到,它会再去找x=3,如果还没找到,再去找x=2,还是没有的话,再找到x=1。

Python名称空间与作用域的更多相关文章

  1. python名称空间和作用域

    python名称空间和作用域 名称空间 名称空间:例如a=1000,python解释器会开辟一块新的内存来存贮1000这个变量值,然后会有一个a指向这个1000,那么a存在哪里?其实他和变量值差不多, ...

  2. Python 名称空间和作用域

    a = 10 # lst = [1,2,3,4] # # # 内置函数 print("你好啊,我叫赛利亚") # def chi(): a = 10 b = 20 # # # # ...

  3. Python 名称空间与作用域、闭包与装饰器

    Python 的名称 Python 的名称(Name)是对象的一个标识(Identifier).我们知道,在 Python 里面一切皆对象,名称就是用来引用对象的.说得有点玄乎,我们以例子说明. 例如 ...

  4. python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域

    一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...

  5. python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  6. python之函数对象、函数嵌套、名称空间与作用域、装饰器

    一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...

  7. python基础知识13---函数对象、函数嵌套、名称空间与作用域、装饰器

    阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 1 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 ...

  8. python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域

    复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参:       -- 形参:在函数定义时()中出现的参数       ...

  9. Python 的名称空间和作用域

    最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...

随机推荐

  1. http常见状态码分析

    200:这个是最常见的http状态码,表示服务器已经成功接受请求,并将返回客户端所请求的最终结果 301:客户端请求的网页已经永久移动到新的位置,当链接发生变化时,返回301代码告诉客户端链接的变化, ...

  2. ScrollView设置了ContentSize高度为0,仍然能滑动的问题

    你有没有遇到过这样的情况: 对于ScrollView的不能上下滑动,设置了以下代码: _scrollViewTitle=[[UIScrollView alloc]initWithFrame:CGRec ...

  3. JavaScript面向对象当中的几个概念

    JS面向对象过程中的几个概念 前言 面向对象描述的是一种代码组织解构的形式,一种在软件中对真实世界中问题领域的建模方法. 下面将从理论层面来介绍下面向对象编程中一些常见的概念. 对象 所谓对象,本质上 ...

  4. nginx +域名

    文件nginx.config: server { listen 80 ; server_name dns19.hichina.com;location / { proxy_pass http://12 ...

  5. java并发学习资料

    1.Java 并发编程知识梳理以及常见处理模式 https://github.com/Fadezed/concurrency 2.Java 高并发多线程编程系列 https://github.com/ ...

  6. [转帖]超能课堂:Intel平台芯片组变迁史

    https://www.expreview.com/69419.html 现在我们在购买电脑时一个最重要的硬件就是主板了.作为承载CPU等主要硬件的平台,其最重要的功能就是连接外围设备,扩展计算机.但 ...

  7. Spring_four

    Spring_four 基于XML的AOP实现事务控制 坐标xml ; //2.6更新转入账户 accountDao.updateAccount(target); } } 注意:方法级别的事务会覆盖类 ...

  8. GC垃圾回收理解

    内存的计算 -Xms1G -Xmx2G -Xmn500M -XX:MaxPermSize=64M -XX:+UseConcMarkSweepGC -XX:SurvivorRatio=3, 请问eden ...

  9. C++多线程基础学习笔记(二)

    先总结延申以下前面(一)所讲的内容. 主线程从main()函数开始执行,我们创建的线程也需要一个函数作为入口开始执行,所以第一步先初始化函数. 整个进程是否执行完毕的标志是主线程是否执行完毕,一般情况 ...

  10. CSP-J 2019 T3 纪念品

    \(\mathfrak{a}\).反思: 通过这道题成功发现自己的背包还是很差\(w\): 可能这是我\(gu\)了好久好久博客的报应叭 就在做这个题的时候,自己连背包\(dp\)的思想都忘了 背包可 ...