iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python学习:作用域(namespa
  • 957
分享到

Python学习:作用域(namespa

作用Pythonnamespa 2023-01-31 01:01:09 957人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

Python作用域基础python有四个作用域:L(Local)本地也称作局部作用域;E(Enclosing)闭包函数外的函数中;G(global)全局作用域;B(Built-in)内建作用域;变量可以在三个不同的地方分配:如果一个变量在d

Python作用域基础

python有四个作用域:

  1. L(Local)本地也称作局部作用域;

  2. E(Enclosing)闭包函数外的函数中;

  3. G(global)全局作用域;

  4. B(Built-in)内建作用域;

变量可以在三个不同的地方分配:

  • 如果一个变量在def内赋值,它被定位在这个函数之内。

  • 如果一个变量在嵌套的def中赋值,对于嵌套的函数来说,它是非本地的。

  • 如果在def之外赋值,它就是整个文件全局的。

值得注意的是,修改一个对象并不是对一个名称赋值。

变量名解析:LEGB原则

对于一个def语句:

变量名引用分为三个作用域进行查找:首先是本地,之后是函数内(如果有的话),之后全局,最后是内置。L->E->G->B

Python除了def/class/lambda外,其他如:if/elif/else/  try/except  for/while并不能改变作用域。定义在他们之内的变量,外部还是可以访问。

>>> if True:
...     a = 'I am A'
... 
>>> a
'I am A'
# 定义在if语言中的变量a,外部还是可以访问的。
# 但是需要注意如果if被 def/class/lambda 包裹,在内部赋值,就变成了此 函数/类/lambda 的局部作用

在def/class/lambda内进行赋值,就变成了其局部作用域。局部作用域会覆盖全局作用域,但不会影响全局作用域。

g=1            #全局变量
def func():
    g = 2      #局部变量
    return g

print func()    #结果为2
print g         #结果为1

值得注意的是,有时候想再函数内调用全局变量,疏忽了会报错,如下:

#file1
var = 1
def func():
    print var
    var = 200

func()

#file2
var = 1
def func():
    var = var +1
    return var

func()

#这两个函数都会报错UnboundLocalError: local variable 'var' referenced before assignment

上述两个函数都会报同样的错误:为赋值之前引用变量!为什么?在函数内部,解释器探测到变量var重新被赋值,所以var变成了局部变量,但是在被赋值之前就使用了var,便会出现这个错误。解决的方法是在函数内部添加globals var语句,但运行函数后全局的var也会被修改。

#file1
var = 1
def func():
    global var
    print var
    var = 200

func()        #结果为1
print var     #全局变量var变为200

#file2
var = 1
def func():
    global var
    var = var +1
    return var

print func()        #结果为2


闭包Closure

闭包的定义:如果在一个内部函数里,对外部函数内(不是全局变量)进行引用,那么内部函数就被认为是闭包(closure)。

a = 1
def external():
    global a
    a = 200
    print a
    b =100
    def internal():
        print b
        b = 200
        return b
    internal()
    print b

print external()
#一样会报错,赋值前引用UnboundLocalError: local variable 'b' referenced before assignment

python3中有关键字nonlocal可以解决这个问题,但在Python2中尽量不要尝试修改闭包中的变量。

关于闭包,还有一个坑:

from functools import wraps

def wrapper(log):
    def external(F):
        @wraps(F)
        def internal(**kw):
            if False:
                log = 'modified'
            print log
        return internal
    return external

@wrapper('first')
def abc():
    pass

print abc()

也会出现 引用在赋值之前 的错误,原因是解释器探测到了 if False 中的重新赋值,所以不会去闭包的外部函数(Enclosing)中找变量,但 if Flase 不成立没有执行,所以便会出现此错误。除非你还需要else: log='var' 或者 if True 但这样添加逻辑语句就没了意义,所以尽量不要修改闭包中的变量。

好像用闭包无法实现计数器功能,因为在闭包内部count+=1就会出现在赋值前引用的错误(Python3用关键字nonlocal可以解决)

def counter(start):
    count = [start]
    def internal():
        count[0] += 1
        return count[0]
    return internal

count = counter(0)
for n in range(10):
    print count()
#结果分别为1,2,3,4,5,6,7,8,9,10

count = counter(0)
print count()
#结果为1


global和globals()

global用来在函数内部声明全局变量,globals() 和 locals() 提供了基于字典的访问全局和局部变量的方式。

比如:如果函数1内需要定义一个局部变量,名字另一个函数2相同,但又要在函数1内引用这个函数2。

def var():
    pass

def f2():
    var = 'Just a String'
    f1 = globals()['var']
    print var
    return type(f1)

print f2()
# Just a String
# <type 'function'>


--结束END--

本文标题: Python学习:作用域(namespa

本文链接: https://www.lsjlt.com/news/183988.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python学习:作用域(namespa
    Python作用域基础Python有四个作用域:L(Local)本地也称作局部作用域;E(Enclosing)闭包函数外的函数中;G(global)全局作用域;B(Built-in)内建作用域;变量可以在三个不同的地方分配:如果一个变量在d...
    99+
    2023-01-31
    作用 Python namespa
  • Python学习之名字,作用域,名字空间
    目录变量只是一个名字作用域和名字空间LGB规则eval和exec前言: 我们在PyFrameObject里面看到了3个独立的名字空间:f_locals、f_globals、f_bui...
    99+
    2024-04-02
  • Python学习之名字,作用域,名字空间(下)
    目录LEGB规则global表达式属性引用与名字引用属性空间小结前言: 这里再回顾一下函数的local空间,首先我们往global空间添加一个键值对相当于定义一个全局变量,那么如果往...
    99+
    2024-04-02
  • Python作用域与名字空间源码学习笔记
    目录作用域与名字空间1. 名字绑定1.1 赋值1.2 模块导入1.3 函数、类定义1.4 as关键字2. 作用域2.1 静态作用域2.2 划分作用域2.3 闭包作用域2.4 类作用域...
    99+
    2024-04-02
  • python学习-使用MySQLdb操作
    操作环境为python2.7 centos7一、MySQLdb的安装与配置MySQLdb是用于Python连接mysql数据库的接口,它实现了Python数据库api规范2.0。按照以下方式安装yum install epel-releas...
    99+
    2023-01-31
    操作 python MySQLdb
  • Python学习day3作业
    作业需求 HAproxy配置文件操作 根据用户输入,输出对应的backend下的server信息 可添加backend 和sever信息 可修改backend 和sever信息 可删除backend 和sever信息 操作配置文件前...
    99+
    2023-01-31
    作业 Python
  • Python学习之使用Python操作R
    最近在写一个检查一台服务器上所有游戏区服配置文件中redis某个key值大小的脚本,本打算使用shell+awk+sed的方式去解决这个问题,但是由于redis的配置信息是php数组形式.shell脚本一时没有写出来,就请教他人帮忙写了个p...
    99+
    2023-01-31
    操作 Python
  • Python学习 :文件操作
      文件基本操作流程: 一、 创建文件对象  二、 调用文件方法进行操作 三、 关闭文件(注意:只有在关闭文件后,才会写入数据)   fh = open('李白诗句','w',encoding='utf-8') fh.write('''...
    99+
    2023-01-30
    操作 文件 Python
  • Python学习—文件操作
    1.文件基础知识 1.文件是存储在外部介质上的数据的集合,文件的基本单位是字节,文件所含的字节数就是文件的长度。每个字节都有一个默认的位置,位置从0开始,文件头的位置就是0,文件尾的位置是文件内容结束后的后一个位置,该位置上没有文件内容,为...
    99+
    2023-01-31
    操作 文件 Python
  • 学习python有哪些实际作用
    本篇内容主要讲解“学习python有哪些实际作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“学习python有哪些实际作用”吧!  1、自动化办公:在我们的工作之中,其实有很多工作都是每天重复...
    99+
    2023-06-01
  • Python 学习笔记 - 操作MySQ
    Python里面操作MySQL可以通过两个方式:pymysql模块ORM框架的SQLAchemey本节先学习第一种方式。学习Python模块之前,首先看看MySQL的基本安装和使用,具体语法可以参考豆子之前的博客http://beanxyz...
    99+
    2023-01-31
    学习笔记 操作 Python
  • Python学习之文件操作
    #/usr/bin/python content='''\                      #这里使用''' This is a test file for python ''' f=file('content.txt','w'...
    99+
    2023-01-31
    操作 文件 Python
  • python学习day8 文件操作
    老男孩python全栈day8 文件操作 编码方式:utf-8  gbk...... 操作方式:只读,只写,追加,读写,写读。。。  以什么编码方式打开文件,就以什么编码方式进行操作 只读: r f = open('d:\模特主妇护士班...
    99+
    2023-01-30
    操作 文件 python
  • Python学习day1作业总结
    为了以后更好更快速的复习,此博客记录我对作业的总结。对于基础作业,我认为最重要的是过程,至于实现是不是完美,代码是不是完美,虽然重要,但是作业过程中,用到的知识点是值得总结和整理的。1. 用户输入帐号密码进行登陆  2. 用户信息保存在文件...
    99+
    2023-01-31
    作业 Python
  • Python学习
    Python是创始人吉多•范罗苏姆(Guido van Rossum)在1989年圣诞节期间,在阿姆斯特丹,为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,而在给自己新创造的计算机语言起名字的时候,由于其是,自于七十年代风靡全球的英国六...
    99+
    2023-01-31
    Python
  • 学习python
    亲爱的朋友:     欢迎你!很高兴能在这里见到你,你能来到这里说明你真的很喜欢python,很想把python给学好!我觉的你很幸运,开始我学python的时候比较少资料,学起来也比较头疼,现在随着python越来越流行,资料也越来越多,...
    99+
    2023-01-31
    python
  • Python 学习
    第一次学习python查阅的资料一,熟悉基本在正式介绍python之前,了解下面两个基本操作对后面的学习是有好处的:1)基本的输入输出 可以在Python中使用+、-、*、/直接进行四则运算。11+3*3查看全部10(2)导入模块 使用im...
    99+
    2023-01-31
    Python
  • python学习——使用webAPI
    1、Web API 是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互。这种请求称为API调用。请求的数据将以易于处理的格式(JSON或CSV)返回。 2、GitHub GitHub是一个让程序员能够协作开发项目的网...
    99+
    2023-01-31
    python webAPI
  • python学习笔记(一)-文件操作
    python的基本文件操作是包含在__buildin__模块中的。   I, 基本操作1, 打开fh=open('filename', 'r')   fh是打开文件的handle,每一个被打开的文件都应该退出时关闭(除了handle没有赋给...
    99+
    2023-01-31
    学习笔记 操作 文件
  • JSP学习笔记(3)——域对象的属性操作
    pageContext, request,session,application 对象都有这些方法,称为域对象Object getAttribute(String name)Enumeration getAttributeNames()re...
    99+
    2023-01-31
    学习笔记 属性 对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作