2015-02-11 68 views
0

Python documentation状态:func_globals是否可变?

__globals__func_globals

的引用保存功能的全局变量的字典 - 在其中定义的功能模块的全局命名空间。

只读

但是修改字典工作得很好。提到的Read-only属性是否排除不变性?

+0

在2.7.6我可以改变'__globals__'和'func_globals'(和'foo.func_globals是foo .__ globals__')。你能否提供一个演示你所看到的行为的例子? – jonrsharpe 2015-02-11 12:24:11

+0

@jonrsharpe对不起,我搞砸了一点。我测试了分配以及设置值。虽然后者适用于两种属性,但第一种不适用。我将因此改变我的问题,并询问提及的只读是否排除不可变。 – 2015-02-11 12:38:26

+0

你得到一个可变的字典引用。你不能重新分配(例如'foo.func_globals = {}'),但你可以改变它的内容。 – jonrsharpe 2015-02-11 13:22:21

回答

3

首先,请注意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>}