Python变量作用域(一)
在一个程序中使用变量名时,Python创建、改变或者查找变量名都是在所谓的命名空间中进行的。作用域指的就是命名空间。
Python中的变量名在第一次赋值时已经创建,并且必须经过赋值后才能够使用。由于变量名最初没有声明,Python将一个变量名
被赋值的地点关联为一个特定的命名空间。也即是说,在代码中给一个变量赋值的地方决定了这个变量将存在于哪个命名空间,也
就是它可见的范围。
函数除了打包代码之外,还为程序增加了一个额外的命名空间曾:在默认的情况下,一个函数的所有变量名都是与函数的命名空间
相关联的。这意味着:1、一个在def内定义的变量名能够被def内的代码使用。不能在函数的外部引用这样的变量名。
2、def之中的变量名与def之外的变量名并不冲突,即使是使用在别处的相同的变量名。一个在def之外被赋值的变量X与在这个def
之中的赋值的变量X是完全不同的变量。
函数定义了本地作用域,而模块定义的是全局作用域。这两个作用域有如下的关系:
1、内嵌的模块是全局作用域。每个模块都是一个全局作用域。对于外部的全局变量就成为一个模块对象的属性,但是在一个模块中能够
像简单的变量一样使用。
2、全局作用域的作用范围仅限于单个文件。这里的全局指的是在一个文件的顶层的变量名仅对于这个文件内部的代码而言是全局的。
3、每次对函数的调用都创建了一个新的本地作用域。即是说,将会存在由那个函数创建的变量的命名空间。可以认为每一个def语句都定
义了一个新的本地作用域,但是因为Python允许函数在循环中调用自身,所以从技术上讲,本地作用域实际上对应的是函数的调用。换句话
说,每一个函数调用都创建了一个新的本地命名空间。递归在处理不能提前预知的流程结构时是一个有用工具。
4、赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量。
5、所有其他的变量名都可以归纳为本地、全局或者内置的。
变量名解析遵循的原则:LEGB原则
1、当在函数中使用未认证的变量名时,Python搜索4个作用域【本地作用域(L),之后是上一层结构中def或lambda的本地作用域(E),
之后是全局作用域(G)、最后是内置作用域(B)】并且在第一处能够找到这个变量名的地方停下来。如果没有搜索到变量名,Python会报错。
2、当在函数中给一个变量名赋值时,Python总是创建或改变本地作用域的变量名,除非它已经在哪个函数中声明为全局变量。
3、当在函数之外给一个变量名赋值时,本地作用域与全局作用域是相同的。
全局变量的总结:
1、全局变量是位于模块内部的顶层的变量名
2、全局变量如果是在函数内部赋值的话,必须经过声明
3、全局变量在函数内部不经过声明也可以使用
根据要求的对象,工厂函数有时候也称作闭合,即一个能够记住嵌套作用域的变量值的函数,即使那个作用域已经不存在了。工厂函数有时用于需要
及时生成事件处理,实时对不同情况进行反馈的程序中。例如:
def maker(N):
def action(X):
return X**N
return action f = maker(2)
f(3)
运行结果:9
f(4)
运行结果:16 f = maker(3)
f(3)
运行结果:27
f(4):
运行结果:64
Python变量作用域(一)的更多相关文章
- python变量作用域
[python变量作用域] 几个概念: python能够改变变量作用域的代码段是def.class.lamda. if/elif/else.try/except/finally.for/while 并 ...
- Python 变量作用域 LEGB (上)—— Local,Global,Builtin
Python 变量作用域的规则是 LEGB LEGB含义解释:L —— Local(function):函数内的名字空间E —— Enclosing function locals:外部嵌套函数的名字 ...
- Python 变量作用域与函数
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- Python 变量作用域 LEGB (下)—— Enclosing function locals
上篇:Python 变量作用域 LEGB (上)—— Local,Global,Builtin https://www.cnblogs.com/yvivid/p/python_LEGB_1.html ...
- python——变量作用域及嵌套作用域
----------------------------------------------------------------------------- 前言-------------------- ...
- python 变量作用域、闭包
先看一个问题: 下面代码输出的结果是0,换句话说,这个fucn2虽然已经用global声明了variable1,但还是没有改变变量的值 def func1(): variable1=0 def fun ...
- python变量作用域,函数与传参
一.元组传值: 一般情况下函数传递参数是1对1,这里x,y是2个参数,按道理要传2个参数,如果直接传递元祖,其实是传递一个参数 >>> def show( x, y ): ... p ...
- Python 变量作用域,闭包和装饰器
from dis import dis b = 6 def f1(a): print(a)print(b) b = 9 f1(3) print(dis(f1)) # dis模块可以查看python函数 ...
- python 变量作用域 v.__sizeof__() python 深复制 一切皆对象 尽量减少内存消耗
python 深入理解 赋值.引用.拷贝.作用域 - 江召伟 - 博客园 https://www.cnblogs.com/jiangzhaowei/p/5740913.html a=[1,2,5]b= ...
随机推荐
- Python OpenCV —— Modifying
一些索引和修改图像像素点数据等的操作,可打印观察运行结果. # -*- coding: utf-8 -*- """ Created on Wed Sep 28 00:11 ...
- solr异常解决
使用solr1.4跟solr3.1时,配置了个唯一id类型是sint 或者int,启动时在tomcat后台就会抛出这个异常: org.apache.solr.common.SolrException: ...
- CentOS6.5安装openLdap
一.关闭防火墙和selinux 关闭防火墙 chkconfig iptables off service iptables stop 关闭selinux vim /etc/selinux/config ...
- ubunut 14.04 将Caps Lock设置为Control
入手了emacs,一直折腾想把caps Lock设置为control键. 网上看到一个用gnome里找到系统-首选项之类可以直接设置的.在14.04版的ub中是找不到的(新版设置太坑,只有那么几个选项 ...
- Sprint第二个冲刺(第十三天)
一.Sprint 计划会议: sprint2计划的功能还没有全部完成,还在实现剩余的两个功能模块,目前工作进展还比较顺利,争取下一个sprint完成剩余的所有目标. 以下是真机测试下的拍照和系统相册取 ...
- 数据获取以及处理系统 --- 功能规格说明书V2.0
产品规格说明书: 版本号: V2.0 版本说明: Version 1.0 简单得需求分析以及构思,初稿形成 Version 2.0 细化beta阶段设计,增加典型用户尝尽以及功能罗列 1. 引言 1. ...
- Oracle学习系列6
Oracle学习系列6 ************************************************************************************ 删除约 ...
- 去除Visual Studio引号中的内容和注释中出现的波浪下划线
[描述] 使用vs2013,注释或者字符串常量中,经常会出现红色的波浪线,非常烦人. 注意,不是代码错误的那种波浪线,我觉得代码错误智能提示的波浪线还是有必要留着的,这样可以避免过多的编译来发现错误, ...
- 论文笔记之:Hybrid computing using a neural network with dynamic external memory
Hybrid computing using a neural network with dynamic external memory Nature 2016 原文链接:http://www.na ...
- oracle 查询数据库表空间大小和剩余空间
dba_data_files:数据库数据文件信息表.可以统计表空间大小(总空间大小). dba_free_space:可以统计剩余表空间大小. 增加表空间即向表空间增加数据文件,表空间大小就是数据文件 ...