python中的名称空间以及作用域分析

从Python解释器开始执行之后,就在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征性的将函数名读入内存,表示知道这个函数存在了,至于函数内部的变量和逻辑,解释器根本不关心。等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。

名称空间:存放名字与内存地址关系的一个空间

全局名称空间:在python代码运行时就创建的变量名与内存地址对应关系的空间

局部名称空间:函数或类在运行时临时开辟出来的内存空间

作用域:作用域就是能够起作用的范围(如变量名被引用)

在python中,作用域分为全局作用域局部作用域

全局作用域:包含内置名称空间以及全局名称空间,在python文件中任意位置都能被引用,全局有效。

局部作用域:局部名称空间,只在局部有效,如函数,类等

作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关

名称空间的加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

名称空间的取值顺序:局部命名空间->全局命名空间->内置命名空间

global:

声明一个全局变量。
在局部作用域中想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。
def func():
global a #没有则创建一个全局变量
a = 3
func()
print(a) #3 count = 1
def search():
global count
count = 2
search()
print(count) #2 def foo():
a = 1
def bar():
global a
print(a)
bar()
foo() #报错 name 'a' is not defined
#这是由于foo中的a不是全局作用域中的变量,那么在bar中重新创建了一个全局变量a,但是没有给a赋值,所以爆出这个错误 #对可变数据类型(list,dict,set)可以直接引用不用通过global,但是不能对改变它的内存地址,可以增加、删除,但`l1=l1[1:3]`时,这样就修改了原来的内存地址,所以会报错。
li = [1,2,3]
dic = {'a':'b'} def change():
li.append('a')
dic['q'] = 'g'
print(dic)
print(li)
change()
print(li)
print(dic)

nonlocal:

不能修改全局变量。
在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
def add_b():
b = 42
def do_global():
b = 10
print(b) #10 --------->1
def dd_nonlocal():
nonlocal b
b = b + 20
print(b) #30
dd_nonlocal()
print(b) #30 -------------2
do_global()
print(b) #42
add_b()
#由于dd_nonlocal中声明的变量是从do_global中引用来的,所以在函数do_global中以及里面嵌套的函数中,都是相同的变量b,同时代码是从上到下执行,所以1出的b还没改变,还是10,但是2处的b已经改变了 a = 1
def foo():
print(a)
def bar():
nonlocal a
print(a)
bar()
foo() #SyntaxError: no binding for nonlocal 'a' found
#报错是由于nonlocal只能定义局部变量,此时的a是全局变量,所以报错

globals():查看全局作用域中的变量

locals():查看当前作用域中的变量

同时需要注意,在局部作用域中只能对全局变量进行引用,但是不能修改,这个修改只指的是不能对被引用的变量的内存地址进行改变,

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

  1. 搞懂Python的类和对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 ...

  2. 论python中的作用域

    编程语言从早至今,可以分为面向过程编程.面向函数编程和面向对象编程.BASIC语言是典型的面向过程编程的语言,C语言支持面向函数编程,但不支持面向对象,JAVA只支持面向对象编程,python同时支持 ...

  3. Python中的作用域

    Python中的作用域 Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 当 Python 遇到一个变量的话他会按照这样的顺序进行搜索: 本地作用域(Local)→当前作用域被嵌 ...

  4. 同一个POD中默认共享哪些名称空间

    如果通过POD的形式来启动多个容器那么它们的名称空间会是共享的么,所以我这里讨论是在默认情况下同一个POD的不同容器的哪些名称空间是打通的.这里先说一下结论,共享的是UTS.IPC.NET.USER. ...

  5. 《Python》 函数进阶和名称空间作用域

    函数进阶: 一.动态参数:*args  **kwargs *args是元祖形式,接收除去键值对以外的所有参数 # args可以换成任意变量名,约定俗成用args **kwargs接收的只是键值对的参数 ...

  6. Python 函数对象-函数嵌套-名称空间与作用域-闭包函数

    今日内容: 1. 函数对象 函数是第一类对象: 指的是函数名指向的值可以被当中数据去使用 1.可以被引用 2.可以当做参数传给另一个函数 3.可以当做一个函数的返回值 4.可以当做容器类型的元素 2. ...

  7. python之函数对象、名称空间、嵌套、作用域、闭包

    函数对象 # 函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象​# 函数对应的原因# 1 可以直接被引用# 2 可以当作函数参数传递# 3 可以作为函数的返回值 ...

  8. python 函数动态参数,名称空间,global,nonlocal

    ##################################总结######################################动态参数 *args:位置参数动态传参,接收到的是元 ...

  9. python中的作用域以及内置函数globals()-全局变量、locals()-局部变量

    在python中,函数会创建一个自己的作用域,也称为为命名空间.这意味着在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 通过内置函数globals()返回的是python解释器能知道的变 ...

随机推荐

  1. SQL夯实基础(二):连接操作中使用on与where筛选的差异

    一.on筛选和where筛选 在连接查询语法中,另人迷惑首当其冲的就要属on筛选和where筛选的区别了,如果在我们编写查询的时候, 筛选条件的放置不管是在on后面还是where后面, 查出来的结果总 ...

  2. php7 新特性整理

    PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来越好. 在这里整理 PHP 5.1 ,PHP5.2,PHP5.3,PHP5.4,PHP ...

  3. BZOJ2120:数颜色(莫队版)

    浅谈莫队:https://www.cnblogs.com/AKMer/p/10374756.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...

  4. vim 显示行号

    set nu https://blog.csdn.net/lwj103862095/article/details/8122316

  5. 蓝桥杯 算法训练 ALGO-119 寂寞的数

    算法训练 寂寞的数 时间限制:1.0s   内存限制:256.0MB 问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和.例如,d(2 ...

  6. HDOJ1016(标准dfs)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. Spring Boot 集成RabbitMQ

    在Spring Boot中整合RabbitMQ是非常容易的,通过在Spring Boot应用中整合RabbitMQ,实现一个简单的发送.接收消息的例子. 首先需要启动RabbitMQ服务,并且add一 ...

  8. Swing编程---添加背景图片的方法

    总结:看下我的运行图片.这个图片很重要.很能说明问题.它的frame就是一个小图片.就是背景.么手贱把它放大. 在微软的操作系统上,你放多大,窗口就有多大,你看到背景就成了小图片,就会误以为不是背景. ...

  9. Weblogic wls RCE 漏洞验证POC

    #!/usr/bin/env python # coding:utf-8 # @Date : 2017/12/22 17:11 # @File : weblogic_poc.py # @Author ...

  10. 【Java】java.util.Objects 源码学习

    2017-02-10 by 安静的下雪天  http://www.cnblogs.com/quiet-snowy-day/p/6387321.html    本篇概要 Objects 与 Object ...