0
的Python documentation状态:func_globals是否可变?
__globals__
func_globals
的引用保存功能的全局变量的字典 - 在其中定义的功能模块的全局命名空间。
只读
但是修改字典工作得很好。提到的Read-only
属性是否排除不变性?
的Python documentation状态:func_globals是否可变?
__globals__
func_globals
的引用保存功能的全局变量的字典 - 在其中定义的功能模块的全局命名空间。
只读
但是修改字典工作得很好。提到的Read-only
属性是否排除不变性?
首先,请注意func.func_globals
和func.__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>}
在2.7.6我可以改变'__globals__'和'func_globals'(和'foo.func_globals是foo .__ globals__')。你能否提供一个演示你所看到的行为的例子? – jonrsharpe 2015-02-11 12:24:11
@jonrsharpe对不起,我搞砸了一点。我测试了分配以及设置值。虽然后者适用于两种属性,但第一种不适用。我将因此改变我的问题,并询问提及的只读是否排除不可变。 – 2015-02-11 12:38:26
你得到一个可变的字典引用。你不能重新分配(例如'foo.func_globals = {}'),但你可以改变它的内容。 – jonrsharpe 2015-02-11 13:22:21