代码之家  ›  专栏  ›  技术社区  ›  Ivo van der Wijk

混合了全局变量/参数和名为“top”的函数的奇怪python行为

  •  20
  • Ivo van der Wijk  · 技术社区  · 14 年前

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

    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
    

    在Python3.1上

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

    这已经很奇怪了;如果“deck”在一个方法中是全局的,而在另一个方法中是参数,那么为什么会有冲突呢?

    有人能解释一下这种行为吗?我觉得我错过了一些很明显的东西。“top”这个名字是不是影响了某些作用域的内部结构?

    更新

    这看起来确实是python核心中的一个bug。 I have filed a bug report .

    1 回复  |  直到 14 年前
        1
  •  13
  •   Aaron Digulla    14 年前

    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

    如果我是你,我会把它当作虫子报告。