首页  |  Linux  |  C/C++  |  网络编程  |  Python   |  Algorithm  |  数据库  |  经验  |   人生 & 随想   |  站内搜索  |  关于

<<< previous

该文已被浏览3420

Python:vars(),locals()和globals()的区别

2015-11-04

在Python中有三个内置函数,分别为vars(),locals()globals(),它们三者之间有着一些相似的地方,因此很容易弄混。下面将讨论Python中这三个内置函数的相似之处和不同之处。
vars(),globals()locals()三者的功能如下: 下面举例来说明以上几点:
>>> a = 100
>>> def foo():
...  b = 200
...  c = 300
...  print('globals():',globals())
...  print('locals():',locals())
...  print('vars():',vars())
...
>>> foo()
globals(): {'__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__name__': '__main__',
'__builtins__': <module 'builtins' (built-in)>, 'a': 100, 'foo': <function foo at 0xb7271584>, '__package__': None, '__spec__': None, '__doc__': None} locals(): {'c': 300, 'b': 200} vars(): {'c': 300, 'b': 200}
有程序的输出可见,globals()函数输出了模块命名空间的字典;而vars()和locals()函数的输出则相同,这两个函数输出了当前命名空间(即foo()函数命名空间的字典)。
Python中的这一技术可以方便地用在基于字典的字符串格式化,示例如下:
>>> name = 'Tom'
>>> age = 20
>>> introduction = """
Hello,my name is %(name)s and I'm %(age)d years old.
"""
>>>print(introduction % locals())
Hello,my name is Tom and I'm 20 years old.
此外,vars()函数还可以接受一些参数,比如模块,类等,此时vars()可以返回相应参数的命名空间的字典,这也是vars()与locals()的不同之处。
示例如下:
>>> class Foo():
...   a = 100
...   def __init__(self):
...    b = 200
...
>>> vars(Foo)
mappingproxy({'__init__': <function Foo.__init__ at 0xb7216584>, '__weakref__': <
attribute '__weakref__' of 'Foo' objects>, '__dict__': <attribute '__dict__' of 'Foo' objects>, 'a': 100, '__doc__': None, '__module__': '__main__'})
从输出结果中可以看出,vars()函数返回了Foo类的命名空间的字典.

一如既往,如果你对文章中的内容有任何疑问,或者是发现文章中有任何错误,都可以通过下面的地址发邮件告诉我.
E-mail: rytubuntulinux@gmail.com