繁体   English   中英

混合全局/参数和名为'top'的函数的奇怪python行为

[英]strange python behaviour with mixing globals/parameters and function named 'top'

以下代码(不是直接在解释器中,而是作为文件执行)

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

在python 3.1上

python2.4似乎接受这个代码,2.6.4交互式解释器也是如此。

这已经很奇怪了; 如果它是一个方法中的全局和另一个方法中的参数,为什么'deck'会发生冲突?

但它更奇怪了。 将'top'重命名为其他任何东西,问题就会消失。

有人可以解释这种行为吗? 我觉得我错过了一些非常明显的东西。 名称“顶部”是否会以某种方式影响某些范围内部?

更新

这确实似乎是python核心中的一个错误。 我已经提交了一份错误报告

看起来它是符号表处理中的错误。 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'来引用顶级代码,但为什么它不使用不能与真实变量冲突的东西我不知道。

如果我是你,我会把它报告为一个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM