学习locals和globals

#!/usr/bin/python
#coding:utf-8


#学习巧用locals局部变量函数
"""
1.Python 如何处理变量。
    (1).Python 有两个内置的函数,locals 和 globals
    (2).它们提供了基于 dictionary 的访问局部和全局变量的方式


2.下面来了解下关于命名空间的知识:
    Python 使用叫做名字空间的东西来记录变量的轨迹。名字空间只是一个 dictionary ,
    它的键字就是变量名,它的值就是那些变量的值。实际上,名字空间可以像 Python
    的 dictionary 一样进行访问
3.名名空间的介绍:
    在一个 Python 程序中的任何一个地方,都存在几个可用的名字空间。每个函数都有
    着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局
    部定义的变量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块
    的变量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字
    空间,任何模块均可访问它,它存放着内置的函数和异常


4.当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照
  如下顺序:
    (1).局部名字空间――特指当前函数或类的方法。如果函数定义了一个局部变量 x,或
        一个参数 x,Python 将使用它,然后停止搜索。
    (2).全局名字空间――特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,
        Python 将使用它然后停止搜索。
    (3).内置名字空间――对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是
        内置函数或变量。
    (4).如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常
        同时传递 There is no variable named 'x' 这样一条信息
"""


#下面是操作的例子


"""
def func(x,y):
    z = x + y
    print locals()




if __name__ == "__main__":
    func(10,20)


#输出的结果是:
#>>>
#{'y': 20, 'x': 10, 'z': 30}
#可以看到局部变量里面的内容,是以字典的形式去记录的

"""
#上述例子的说明
"""
1.函数 foo 在它的局部名字空间中有两个变量: x,y (它的值是被传入函数的)和z(它是在函数里定义的)。

2.locals 返回一个名字/值对的 dictionary。这个 dictionary 的键字是字符串形式的变量名字,

"""
"""


import string


def func(x):
    global m
    m = x
    print globals()
    print "####################"
    print locals()


if __name__ == "__main__":
    func(10)




"""
#输出的结果是():
#>>>
#{'string': <module 'string' from 'C:\Python27\lib\string.pyc'>, '__builtins__': <module '__builtin__' (built-in)>,
# 'm': 10, '__package__': None, 'func': <function func at 0x02A12C70>, '__name__': '__main__', '__doc__': None}
#"####################"
#{'x': 10}
#上述可以看到函数的的全局变量 (m 通过global生命全局变量也变成的全局变量)
#导入的模块也变成的全局变量
#记得 if __name__ 技巧吗?当运行一个模块时 (相对于从另外一个模块中导入而言),
#内置的 __name__ 是一个特殊值 __main__。因为我们是把这个模块当作脚本从命令来
#运行的,故 __name__ 值为 __main__



###############################################################


#locals 和 globals的区别:
#locals 是只读的,globals 不是 如下:
"""
def func(args):
    x = 1
    global m
    m = x
    print locals()
    locals()['x'] =10
    globals()['m'] = 10
    print 'x = ',x
    print 'm = ',m


if __name__ == "__main__":
    func(5)
"""
#输出的结果是
#>>>
#{'x': 1, 'args': 5}
#x =  1
#m =  10
#上面说明了局部变量是不可变的,全局变量是可变的



####################################################################
#下面是巧用局部变量


_list = []
def func(x,y):
    _list.append("%(x)s ===> %(y)s"%locals())


while len(_list) <10:
    func(len(_list)-1,len(_list)+1)


print _list




#输出的结果是
#>>>
#['-1 ===> 1', '0 ===> 2', '1 ===> 3', '2 ===> 4', '3 ===> 5', '4 ===> 6',
#'5 ===> 7', '6 ===> 8', '7 ===> 9', '8 ===> 10']
#可以生成上面的例子
#格式化字符串的使用

# '%(keys)s'%{key,value} 这样可以出入一个字典

 参考:http://woodpecker.org.cn/diveintopython/html_processing/dictionary_based_string_formatting.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值