python初学者笔记——命名空间

对于初学者而言,闭包的概念一直都是很难理解的。

我在学习的时候,网上查了那么多资料,依然是一知半解。

直到后来我看了这篇文章:http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/

这是一篇很好的文章,由浅入深的告诉你到底闭包,装饰器都是什么东西。

E文不过关?没关系,我来用我自己的理解和你们聊聊命名空间、闭包和装饰器的那些事儿。

前提:

阅读这篇文章的前提,是你要对Python,有基础的理解,如果你有兴趣,但是对python还没有理解,我推荐你去读下面的教程:

www.liaoxuefeng.com

同时,微信公众号:easypython,中文名:说人话的python分享,也是很不错的教程,建议有一定入门基础的同学尝试。

说人话的python实战计划:http://study.163.com/course/introduction/1002794001.htm

开始:

命名空间

命名空间(namespace)这个概念,有时也被称为“作用域”,在大多数讲解闭包的时候都会有所涉及。

那什么是命名空间/作用域呢?

这两个概念,是用来描述一个变量的属性的,它们的意思,就是字面意思:“这个变量起名字的地方/这个变量起作用的域”.

我们用实例来说明一下:

def func():
    x = 1

简单的函数,这个函数定义了一个叫做x的变量,且给了它一个值:1

那么,如果我们print这个变量呢?(我用注释来表示输出)

def func():
    x = 1
    print(x)

func()

# 1

好像完全是废话嘛!print(x)不显示1,难道还显示别的?

那好,我们换一种情况,如果我们在函数体外面print(x)呢?

def func():
    x = 1

print(x)

# Traceback 后面一大堆我省略了...
# NameError: name ‘x‘ is not defined

报了一个错误,错误的类型是name error,名称错误,错误的细节是:x没有定义。

看到这里,细心的朋友应该就知道我说这么多废话是什么意思啦!

x定义在函数体内部嘛,它的“作用范围”就仅仅是函数体内才能用!

你想把X打印出来?想把x加1?想把x乘以2?对不起,请到函数体内部去执行,外面,python不认识它。

说到python不认识它,其实是指“python的解释器”不认识它,解释器具体不多解释,你可以简单的理解为你电脑的python程序。

好吧好吧,python不认识它,那么如果,我换一种情况呢?我把两个语句交换一下位置?

x = 1

def func():
    print(x)

func()

# 1

咦?你这个骗子,你不是说python不认识它吗?现在x不在函数体内定义了(事实上函数体内什么定义都没有~)

你怎么又认识它了?

问到这个问题,就得说一说python程序,读取一个变量的方法了。

简单的说,四个字:由内而外

python先去查函数体内部:

1.我找到了,打印!

2.我找不到,我去找外面,找到了,打印!

3.我找不到,我去找外面,我还是找不到! NameError: 我找不到变量,你丫没定义吧?

看,就是这么个顺序。

那么找不到的x变量去哪里了?

比如这个程序:

def func():
    x = 1

print(x)

x呢?x去哪里了?

答案是x被python解释器给“回收”了,所谓回收,你可以简单的理解成删除了、杀死了。

这里要引入一个概念,就是变量的“存活时间”

我写一下你就了解了(为了方便的标记函数体的结束,我写了一个返回字符串‘done’的return语句):

def func():

    x = 1
    # x的存活时间开始,在x=1这行下面操作x才可以!

    return ‘Done‘  # 函数体结束,x被python杀死了。

就是如上代码中所表述的意思:

一个函数体内变量的存活时间,从定义它的那一刻开始,直到函数体结束为止。

我们可以通过一个很方便的、python给定我们的方法,来判断函数体内部还“活着”的变量有哪些,这个方法是locals()

我们看一个代码:

def func():

    a = ‘哎呀‘
    b = ‘我们‘
    c = ‘还活着‘
    print(locals())

func()

# {‘a‘: ‘哎呀‘, ‘c‘: ‘还活着‘, ‘b‘: ‘我们‘}

看,locals()其实是一个字典,他列出了所有的“变量:变量值”这样的“键-值对”,而且字典是无序的。

locals()里面存的全部都是当前“活着”的变量,我们看另外一个例子:

def func():

    a = ‘哎呀‘
    b = ‘我们‘
    c = ‘还活着‘
    print(locals())
    d = ‘我还没出生‘

func()

# {‘b‘: ‘我们‘, ‘c‘: ‘还活着‘, ‘a‘: ‘哎呀‘}

看,locals()里面就没有变量d什么事情了,因为d在那个时候“还没出生”呢。

那么外部的变量呢?

x = 1
def func():

    a = ‘内部‘
    print(locals())
    print(x)

func()

# {‘a‘: ‘内部‘}
# 1

看到了吧,内部变量只有一个,locals也打印出来了,但是x还是正常的可以打印。

因为python在内部找不到,于是就去外面找了,外部的变量,可以用globals()检查到,但是这个很长…………

x = 1
def func():

    a = ‘内部‘
    print(locals())
    print(globals())

func()

# {‘a‘: ‘内部‘}
# ....(一大堆我就不粘贴了)..... ‘x‘: 1}

命名空间/作用域的概念就是这样,它决定了python程序“去哪里”找到变量。

时间: 2024-11-08 15:39:12

python初学者笔记——命名空间的相关文章

Python初学者笔记(3):输出列表中的奇数/奇数项,字符串中的偶数项,字符串大小写转换

[1]a=[8,13,11,6,26,19,24]1)请输出列表a中的奇数项2)请输出列表a中的奇数 解:1) 1 a=[8,13,11,6,26,19,24] 2 print a[::2] Result:>>>[8, 11, 26, 24] 2) 1 a = [8,13,11,6,26,19,24] 2 b = [] 3 for item in a: 4 if item%2 !=0: 5 b.append(item) 6 else: 7 continue 8 print b Resul

Python初学者笔记:打印出斐波那契数列的前10项

问题:斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加.特别指出:0不是第一项,而是第零项. 方法:Python2.7.9 a=0 b=

Python学习笔记--未经排版

Python 学习笔记 Python中如何做到Print() 不换行 答:Print("输出内容",end='不换行的分隔内容'),其中end=后面为2个单引号 注:在Python 2.x中,Print "输出内容", 即在输出内容后加一逗号 Python中 is 和 == 的区别 答:Python中的对象包含三要素:id.type.value 其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值 is判断的是a对象是否就是b对象,是通过id来

Python语言笔记

Python是一种解释性(没有编译).交互式.面向对象的语言 1.安装python编译器 版本:Python2.7比较普遍,Python不是向下兼容的软件,因此Python3.x有些东西不好找资料 2.在 Windows 设置环境变量,在命令提示框中(cmd) : 输入 path %path%;C:\Python , 按下"Enter".在环境变量中添加Python目录(注意: C:\Python 是Python的安装目录.) 3.输入ctrl+z再按Enter键退出Python编译器

python 学习笔记 7 -- Python关键字总结

0.写在前面的话 学习一门语言最重要的功课是练习与复习,在<笨方法学Python>中第三十七节虽然没有教你任何内容,但是它提醒我们:"学了这么多,你还能记得多少?该复习了!" 下面我们就对这一节的第一部分"关键字"来做个复习: Python中的关键字包括如下: and       del        from      not      while    as        elif       global    or       with     

python学习笔记之module &amp;&amp; package

个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, __init__.py可以有两种形式, 一种是直接import多个模块,例如 import fibo import abc 另外一种是 __all__ = ["A","B"] python学习笔记之module && package python的mo

Python学习笔记 | 变量 + 引用 + 拷贝 + 作用域

在Python中,变量是没有类型的,在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没有赋值,那么Python认为这个变量没有定义(not defined). 一.变量和对象 1. 可变对象和不可变对象 在Python中,对象分为两种:可变对象和不可变对象,不可变对象包括int,float,long,str,tuple等,可变对象包括list,set,dict等.需要注意的是:这里说的不可变指的是值的不可变.对于不可变类

python学习笔记-抓取网页图片脚本

初学者一枚,代码都是模仿网上的.亲测可用~ 运行脚本的前提是本机安装了httplib2模块 #!/usr/bin/python import os import re import string import urllib #author:reed #date:2014-05-14 def GetWebPictures(): url=raw_input('please input the website you want to download:') imgcontent=urllib.urlo

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho