func_globals是否可变?

时间:2015-02-11 12:10:55

标签: python python-2.7

Python documentation州:

  

__globals__ func_globals

     

对包含函数全局变量的字典的引用 - 定义函数的模块的全局命名空间。

     

只读

然而,修改该词典的工作正常。提到的Read-only属性是否排除了不变性?

1 个答案:

答案 0 :(得分:4)

首先,请注意func.func_globalsfunc.__globals__是对同一事物的两个引用:

  

在2.6版中更改:引入了双下划线属性__closure____code____defaults____globals__作为别名相应的func_*属性,用于向前兼容Python 3。

换句话说:

>>> def foo(bar):
    pass

>>> foo.__globals__ is foo.func_globals
True

当它们被称为“只读”属性时,这是因为您无法重新分配属性:

>>> foo.__globals__ = {}

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    foo.__globals__ = {}
TypeError: readonly attribute

但是,返回的对象是可变的,因为它是一个字典。因此,可以向字典添加密钥并将其从中删除(尽管我建议您不要删除任何密钥,直到您确定知道自己在做什么为止!):

>>> foo.func_globals
{'__builtins__': <module '__builtin__' (built-in)>, 
 '__package__': None, 
 '__name__': '__main__', 
 'foo': <function foo at 0x02ED15F0>, 
 '__doc__': None}
>>> foo.func_globals['bar'] = 'baz'
>>> del foo.func_globals['__doc__']
>>> foo.func_globals
{'bar': 'baz', 
 '__builtins__': <module '__builtin__' (built-in)>, 
 '__package__': None, 
 '__name__': '__main__', 
 'foo': <function foo at 0x02ED15F0>}