为什么分配给空列表而不分配给空元组是有效的? - python

这出现在a recent PyCon talk中。

该声明

[] = []

没有任何意义,但是也不会引发异常。我觉得这一定是由于拆箱规则造成的。您也可以将tuple unpacking与列表一起使用,例如,

[a, b] = [1, 2]

符合您的期望。作为逻辑结果,当要拆包的元素数为0时,这也应该起作用,这将解释为什么分配给空列表是有效的。当您尝试将非空列表分配给空列表时会发生什么,进一步支持了该理论:

>>> [] = [1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack

如果元组也是如此,我将对此解释感到满意。如果我们可以解压缩到包含0个元素的列表,那么我们也应该能够解压缩到具有0个元素的元组,不是吗?然而:

>>> () = ()
  File "<stdin>", line 1
SyntaxError: can't assign to ()

似乎拆包规则没有像列表一样适用于元组。对于这种不一致,我想不出任何解释。有这种现象的原因吗?

参考方案

@ user2357112的评论似乎是巧合,这似乎是正确的。 Python源代码的相关部分在 Python/ast.c 中:

switch (e->kind) {
    # several cases snipped
    case List_kind:
        e->v.List.ctx = ctx;
        s = e->v.List.elts;
        break;
    case Tuple_kind:
        if (asdl_seq_LEN(e->v.Tuple.elts))  {
            e->v.Tuple.ctx = ctx;
            s = e->v.Tuple.elts;
        }
        else {
            expr_name = "()";
        }
        break;
    # several more cases snipped
}
/* Check for error string set by switch */
if (expr_name) {
    char buf[300];
    PyOS_snprintf(buf, sizeof(buf),
                  "can't %s %s",
                  ctx == Store ? "assign to" : "delete",
                  expr_name);
    return ast_error(c, n, buf);
}

tuple明确检查长度不为零,如果长度不为零,则会引发错误。 list没有任何这种检查,因此没有引发异常。

当分配给空元组是一个错误时,我看不出允许分配给空列表的任何特殊原因,但是也许我没有考虑某些特殊情况。我建议这可能是一个(琐碎的)错误,并且两种类型的行为应相同。

Python 3运算符>>打印到文件 - python

我有以下Python代码编写项目的依赖文件。它可以在Python 2.x上正常工作,但是在使用Python 3进行测试时会报告错误。depend = None if not nmake: depend = open(".depend", "a") dependmak = open(".depend.mak&#…

Python:检查是否存在维基百科文章 - python

我试图弄清楚如何检查Wikipedia文章是否存在。例如,https://en.wikipedia.org/wiki/Food 存在,但是https://en.wikipedia.org/wiki/Fod 不会,页面只是说:“维基百科没有此名称的文章。”谢谢! 参考方案 >>> import urllib >>> prin…

Python:对于长时间运行的进程,通过还是休眠? - python

我正在编写一个队列处理应用程序,该应用程序使用线程等待和响应要发送到该应用程序的队列消息。对于应用程序的主要部分,只需要保持活动状态即可。对于像这样的代码示例:而True: 通过要么而True: time.sleep(1)哪一个对系统的影响最小?除了保持python应用运行外,什么都不做的首选方式是什么? 参考方案 我可以想象time.sleep()会减少系…

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python:无法识别Pip命令 - python

这是我拍摄的屏幕截图。当我尝试在命令提示符下使用pip时,出现以下错误消息:pip无法识别为内部或外部命令,可操作程序或批处理文件。我已经检查了这个线程:How do I install pip on Windows?我所能找到的就是我必须将"C:\PythonX\Scripts"添加到我的类路径中,其中X代表python版本。如您在我的…