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

def top(deck):
    pass

def b():
    global deck

产生错误

SyntaxError: name 'deck' is local and global

在Python 2上.6.4和

SyntaxError: name 'deck' is parameter and global

关于python 3.1

Python 2.4似乎接受了这段代码,2.6.4交互解释器也接受了这段代码.

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

但它变得更奇怪了.将"top"基本上重命名为其他任何名称,问题就会消失.

有人能解释一下这种行为吗?我觉得我错过了一些非常明显的东西."top"这个名称是否会以某种方式影响某些范围界定内部?

Update

这似乎确实是python核心中的一个bug.I have filed a bug report

推荐答案

看起来这是符号表处理中的一个错误.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"来表示顶级代码,但我不知道为什么它不使用与实际变量不冲突的东西.

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

Python-3.x相关问答推荐

如何使用Python将嵌套的XML转换为CSV

将列表转换为 pandas 数据框,其中列表包含字典

我们可以在每个可以使用 Pandas Join 的用例中使用 Pandas merge 吗?

如何将列表和字典逐行组合在一起

Pandas matplotlib:条形图占总数的百分比

如何在两个矩阵的比较中允许任何列的符号差异,Python3?

如何向 scikit-learn 函数添加类型提示?

如何在pyspark的列中按连续1分组并保持具有特定大小的组

通过点和线计算CV2 Homography

如何将数据框中的每一行转换为具有属性的 node ?

python 3集合中的Discard()和Remove()函数有什么区别

无法在 Windows Python 3.5 上安装 Levenshtein 距离包

如何为 Python 中的线程设置异步事件循环?

为什么包含类的名称不被识别为返回值函数注释?

Python 3:函数参数中的省略号?

如何调试垂死的 Jupyter Python3 内核?

定义 True,如果没有定义,会导致语法错误

带有 Emacs 的 Python 3

有没有办法在多个线程中使用 asyncio.Queue ?

Python:如何在 Windows 资源管理器中打开文件夹(Python 3.6.2、Windows 10)