什么是名称空间?

  比如下图的长方形代表内存,在这个内存里我要设置一个变量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. 关于bootstrap按钮的偏移

    <body> <div id="divForm" class="addView"> <div class="form-h ...

  2. FAQ_1

    FAQ LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. 启动浏览器,打开Int ...

  3. python programming作业10(仍有一点点小bug)

    # -*- coding: utf-8 -*- import os import platform import sys from PyQt5.QtCore import * from PyQt5.Q ...

  4. Returning array from function in C

    以下为了通俗易懂,使用意译. I've here very intersting discussion about the best and common ways to return an arra ...

  5. ListView中用鼠标拖动各项上下移动的问题。(100分)

    在OnDragDrop事件中處理:以下是delphi的例子 procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integ ...

  6. shell脚本安装python、pip-----非交互式的--批量执行函数

    首先把pip-.tgz 安装包放在 /usr/local 下面,按照顺序先安装pip,再安装python.不要先安装或只安装python,否则很容易出错, cat >>pip-python ...

  7. Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)

    继承: 1.继承是对某一匹类的抽象,从而实现对现实世界更好的建模. 2.提高代码的复用性. 3.extends(扩展),子类是父类的扩展. 4.子类继承父类可以得到父类的全部属性和方法.(除了父类的构 ...

  8. convert.ToInt32和int.parse区别

    前者适合将object类类型转换成int类型 int.Parse适合将string类类型转换成int类型 1)这两个方法的最大不同是它们对null值的处理方法:Convert.ToInt32(null ...

  9. python基础--合并两个列表

    a = [1,2,3] b = [4,5,6] # 将两个列表合并 # append方法是不行的 # a.append(b) # print(a) # [1, 2, 3, [4, 5, 6]] # 我 ...

  10. ubuntu 16.04 server 扩容(LVM)磁盘

    因为发现我的本地server出现磁盘满了的情况 所以进行lvm的扩容 1 查看磁盘情况 df -h 原本发现 /dev/mapper/ubuntu1604--vg-root 这个磁盘满了 所以要进行扩 ...