名称空间与作用域

(1)名称空间(namespaces)

用来存放名字的地方是对栈区的划分

有了名称空间,就可在栈区中放相同的名字

1.1、内置名称空间

存放的名字:是Python解释器内置的名字

"""
交互模式下输入:
>>> input
<built-in function input>
>>> print
<built-in function print>
>>> """

存活周期:Python解释器启动则产生,Python解释器关闭则销毁

1.2、全局名称空间

存放的名字:只要不是函数内定义的,也不是内置的,剩下的都是全局名名称空间

存活周期:Python文件执行则产生,Python文件运行完毕则销毁

1.3、局部名称空间

存放的名字:在调用函数时,运行函数体代码过程中产生的函数内的名字

存活周期:在函数调用时存活,函数调用完毕后则销毁

1.4、名称空间加载顺序

"""
内置名称空间》全局名称空间》局部名称空间
"""

1.5、销毁顺序

"""
局部名称空间》全局名称空间》内置名称空间
"""

1.6、名字查找优先级

"""当前所在的位置向上一层一层查找"""

"""
如果当前在局部名称空间:
局部名称空间》全局名称空间》内置名称空间 如果当前在全局名称空间:
全局名称空间》内置名称空间
"""

示范

示范1:

def func():
print(x)
x=111
func() """结果如下"""
111

示范2:名称空间的‘’嵌套‘’关系是以函数定义阶段为准,与调用位置无关

x=1
def func():
print(x) def foo():
x=222
func()
foo() """结果如下"""
1

示范3:函数嵌套定义

input=111
def f1():
input=222
def f2():
input=333
print(input)
f2()
f1()

示范4

x=111
def fun():
print(x)
x=222
fun()
"""结果报错"""

(2)作用域

作用范围

2.1、 全局作用域

全局作用域:内置名称空间。全局名称空间

"""
全局存活
全局有效:被所有函数共享
"""

2.2、局部作用域

局部作用域:局部名称空间的名字

"""
临时存活
局部有效
"""

2.3、作用域与名字查找的优先级

在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,没有找到,再去全局作用域查找:先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常

x=100 #全局作用域的名字x
def foo():
x=300 #局部作用域的名字x
print(x) #在局部找x
foo()#结果为300

在全局作用域查找名字时,起始位置便是全局作用域,所以先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常

x=100
def foo():
x=300 #在函数调用时产生局部作用域的名字x
foo()
print(x) #在全局找x,结果为100

在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,若要在函数内修改全局名称空间中名字的值,当值为不可变类型时,则需要用到global关键字

x=1
def foo():
global x #声明x为全局名称空间的名字
x=2
foo()
print(x) #结果为2

当实参的值为可变类型时,函数体内对该值的修改将直接反应到原值

num_list=[1,2,3]
def foo(nums):
nums.append(5) foo(num_list)
print(num_list)
#结果为
[1, 2, 3, 5]

对于嵌套多层的函数,使用nonlocal关键字可以将名字声明为来自外部嵌套函数定义的作用域(非全局)

def  f1():
x=2
def f2():
nonlocal x
x=3
f2() #调用f2(),修改f1作用域中名字x的值
print(x) #在f1作用域查看x f1() #结果
3

nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常。

(3)函数全局变量

  • 局部变量:就是在函数内部定义的变量【作用域仅仅局限在函数的内部】
  • 不同的函数,可以定义相同的局部变量,但是各自用各自的 不会产生影响.
  • 局部变量的作用:为了临时的保存数据,需要在函数中定义来进行存储.
  • 当全局变量和局部变量出现重复定义的时候,程序会优先执行函数定义的内部变量.
  • 如果函数内部要想对全局变量进行修改,必须使用global关键字进行声明.
# pro='信息安全'#全局变量
# name='周润发'
# def printInfo():
# name='刘德华'#局部变量
# print('{}'.format(name))
#
# def TestMethod():
# name='peter'#局部变量
# print(name)
# printInfo()
# TestMethod()
#
#
# def message():
# print(pro)
#
# message()
#
pro='123'
def changGlobal():
global pro
pro='456'
print(pro)
changGlobal()

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

  1. python名称空间和作用域

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

  2. Python名称空间与作用域

    什么是名称空间? 比如下图的长方形代表内存,在这个内存里我要设置一个变量100,那么这个变量得有个门牌号,就叫他a吧,但其实变量不是这么存储的,他其实的存储方式是这样的,他会有一个名称空间,这个名称空 ...

  3. Python 名称空间和作用域

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 还不会Traefik?看这篇文章就够了!

    文章转载自:https://mp.weixin.qq.com/s/ImZG0XANFOYsk9InOjQPVA 提到Traefik,有些人可能并不熟悉,但是提到Nginx,应该都耳熟能详. 暂且我们把 ...

  2. 记一次TIME_WAIT网络故障

    文章转载自:https://blog.51cto.com/dngood/988968

  3. Prometheus 通过 consul 分布式集群实现自动服务发现

    转载自:https://cloud.tencent.com/developer/article/1611091 1.Consul 介绍 Consul 是基于 GO 语言开发的开源工具,主要面向分布式, ...

  4. Codeforces Round #710 (Div. 3)

    emmm,就ac了3题 A题转换推下公式. tB题模拟,在第一个与最后一个变x后,直接i下标+k,判断当前下标前一个befor与最后一个last距离是否>k,是的话在当前下标往前找*字符然后改为 ...

  5. 220726 T2 Multisets (思维)

    题目描述 我们说一个可重集 AA 比可重集 BB 小,当且仅当对于两个可重集中出现次数不同的最小元素 xx ,元素 xx 在 AA 中出现次数更多. 例如,可重集 {1,2,3}1,2,3 就比可重集 ...

  6. List接口中的常用方法

    void add(int index, Object ele):在index位置插入ele元素boolean addAll(int index, Collection eles):从index位置开始 ...

  7. 【听如子说】-python模块系列-AIS编解码Pyais

    Pyais Module Introduce pyais一个简单实用的ais编解码模块 工作中需要和ais打交道,在摸鱼的过程中发现了一个牛逼的模块,对ais编解码感兴趣的可以拿项目学习一下,或者运用 ...

  8. JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域

    文章目录 1.对象的简介 2.对象的基本操作 2.1 代码 2.2 测试结果 3.属性和属性值 3.1 代码 3.2 测试结果 4.对象的方法 4.1 代码 4.2 测试结果 5.对象字面量 5.1 ...

  9. 微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍

    微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍 上一篇关于网关的文章: 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Ngi ...

  10. java中HashMap的设计精妙在哪?

    摘要:本文结合图解和问题,教你一次性搞定HashMap 本文分享自华为云社区<java中HashMap的设计精妙在哪?用图解和几个问题教你一次性搞定HashMap>,作者:breakDaw ...