Python名称空间与作用域
什么是名称空间?
比如下图的长方形代表内存,在这个内存里我要设置一个变量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名称空间与作用域的更多相关文章
- python名称空间和作用域
python名称空间和作用域 名称空间 名称空间:例如a=1000,python解释器会开辟一块新的内存来存贮1000这个变量值,然后会有一个a指向这个1000,那么a存在哪里?其实他和变量值差不多, ...
- Python 名称空间和作用域
a = 10 # lst = [1,2,3,4] # # # 内置函数 print("你好啊,我叫赛利亚") # def chi(): a = 10 b = 20 # # # # ...
- Python 名称空间与作用域、闭包与装饰器
Python 的名称 Python 的名称(Name)是对象的一个标识(Identifier).我们知道,在 Python 里面一切皆对象,名称就是用来引用对象的.说得有点玄乎,我们以例子说明. 例如 ...
- python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域
一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...
- python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义
复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...
- python之函数对象、函数嵌套、名称空间与作用域、装饰器
一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...
- python基础知识13---函数对象、函数嵌套、名称空间与作用域、装饰器
阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 1 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 ...
- python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域
复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参: -- 形参:在函数定义时()中出现的参数 ...
- Python 的名称空间和作用域
最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...
随机推荐
- 使用rman备份将rac环境恢复到单实例
使用rman备份将rac环境恢复到单实例 rac环境 [oracle@rac02 ~]$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomai ...
- 【JVM学习笔记】双亲委托机制存在的意义
1.可以确保Java核心库的类型安全:所有的Java应用都至少会引用java.lang.Object类,也就是说在运行期,java.lang.Object这个类会被加载到Java虚拟机:如果用户自定义 ...
- Linux:lvm磁盘分区,动态扩容
一.lvm磁盘分区: 1,查看新增的磁盘,需要使用root权限 fdisk -l 看到有一个新增的100G磁盘 2,对磁盘进行分区 fdisk /dev/xvdb 1,输入:n 表示创建一个新的分区( ...
- NJCTF (easycrack)
安装app查看.一个输入框,输入随便输入显示Try again. 放入JEB反编译. 关于输入框监听是第一次见,具体可以看看这个博客https://www.jianshu.com/p/f976c677 ...
- redis安装及遇到的坑-linux
获取Redis安装包“redis-4.0.8.tar.gz”,上传Linux服务器; 使用root用户解压: tar zxvf redis-4.0.8.tar.gz -C /usr/local/; 进 ...
- 微信路由navigateTo
// pages/index/index.js Page({ /** * 页面的初始数据 */ data: { res:2 }, search: function(e) { var that = th ...
- CentOS 7 替换网易yum 源
首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...
- Pytorch1.0深度学习:损失函数、优化器、常见激活函数、批归一化详解
不用相当的独立功夫,不论在哪个严重的问题上都不能找出真理:谁怕用功夫,谁就无法找到真理. —— 列宁 本文主要介绍损失函数.优化器.反向传播.链式求导法则.激活函数.批归一化. 1 经典损失函数 1. ...
- Springboot 上传报错: Failed to parse multipart servlet request; nested exception is java.lang.IllegalStateException: The multi-part request contained parameter data (excluding uploaded files) that exceede
Failed to parse multipart servlet request; nested exception is java.lang.IllegalStateException: The ...
- webdriervAPI(元素等待)
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException driv ...