以下代码(不直接在解释器中,但作为文件执行)
def top(deck):
pass
def b():
global deck
产生错误
SyntaxError: name 'deck' is local and global
在python2.6.4和
上SyntaxError: name 'deck' is parameter and global
on python 3.1
python2.4似乎接受了这个代码,2.6.4交互式解释器也是如此。
这已经很奇怪了;如果它是一个方法中的全局和另一个方法中的参数,为什么'deck'会发生冲突?
但它更奇怪了。将'top'重命名为其他任何东西,问题就会消失。
有人可以解释这种行为吗?我觉得我错过了一些非常明显的东西。名称“顶部”是否会以某种方式影响某些范围内部?
更新
这确实似乎是python核心中的一个错误。 I have filed a bug report。
答案 0 :(得分:13)
看起来它是符号表处理中的错误。 Python / symtable.c有一些代码(虽然有点混淆)确实将'top'视为特殊标识符:
if (!GET_IDENTIFIER(top) ||
!symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) {
PySymtable_Free(st);
return NULL;
}
稍后会:
if (name == GET_IDENTIFIER(top))
st->st_global = st->st_cur->ste_symbols;
文件中还有一个宏:
#define GET_IDENTIFIER(VAR) \
((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))
使用C预处理器将变量top
初始化为带有变量名称的实习字符串。
我认为符号表必须使用名称“top”来引用顶级代码,但为什么它不使用不能与真实变量冲突的东西我不知道。
如果我是你,我会把它报告为错误。