首页 > 编程语言 >python-名称空间与作用域

python-名称空间与作用域

时间:2022-09-28 18:45:34浏览次数:55  
标签:作用域 print python 名称 空间 全局 def

名称空间与作用域

(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()

标签:作用域,print,python,名称,空间,全局,def
From: https://www.cnblogs.com/saury/p/16739202.html

相关文章

  • python-并发编程
    目录01、理论多道技术null02、进程进程运行的三状态图同步和异步阻塞和非阻塞开启进程的两种方式进程对象的join方法进程之间数据相互隔离(默认情况下)进程对象及其他方法僵......
  • Python错误:模块导入失败from scrapy.xlib.pydispatch import dispatcher
    问题描述:python中使用pip安装模块时,出现:Fatalerrorinlauncher:Unabletocreateprocessusing'"' 解决办法: 原因分析:scrapy版本不对。测试了一下,发现最......
  • python-CSV文件的读写
    CSV文件:Comma-SeparatedValues,中文叫逗号分隔值或者字符分隔值,其文件以纯文本的形式存储表格数据.可以理解成一个表格,只不过这个表格是以纯文本的形式显示,单元格与单元......
  • python-py文件打包成exe可执行文件
    方法一::打包完成后可以直接被他人使用,他人不用安装python环境的可以使用pyinstaller模块实现将python项目打包成exe执行文件"""先安装模块1.pipinstallpyinstaller......
  • python-面向对象属性的访问与self的理解
    属性访问类属性与对象属性在类中定义的名字,都是类的属性,细说的话,类有两种属性:数据属性和函数属性,可以通过__dict__访问属性的值,比如Person1.__dict__['student'],但Python......
  • python-面向过程与函数式
    面向过程与函数式面向过程”面向过程“核心是“过程”二字,“过程”指的是解决问题的步骤,即先干什么再干什么......,基于面向过程开发程序就好比在设计一条流水线,是一种机......
  • 学习Python之变量
    一、变量的使用1、单个变量#变量aa="Helloworld1!"print(a)2、多个变量#变量aa="Helloworld1!"print(a)#变量bb="Helloworld2!"print(b)3、单个变量替换#变量aa="H......
  • Pythontext_3
    1实例一:输出每日一帖2importdatetime#导入日期时间表3#定义一个列表4mot=["今天星期一:\n坚持下去不是因为我很坚强,而是......
  • Go基础编程:作用域
    作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。局部变量在函数体内声明的变量、参数和返回值变量就是局部变量,它们的作用域只在函数体内:fu......
  • Python字节流,字符串,16进制相互转换
    python版本:Python3.81.字节流转成字符串2.字符串变字节流3.16进制字节流变成字节流4.16进制字符串变成字符串字节流 ......