python - 列出扩展的奇怪行为

标签 python list

<分区>

在 Python (2.7) 中发现以前从未提及的有趣的东西。

这个:

a = []
a += "a"

确实有效,结果是:

>>> a
>>> ["a"]

但是

a = []
a = a + "a"

给予

>>> TypeError: can only concatenate list (not "str") to list

谁能解释一下为什么?感谢您的回答。

最佳答案

Python 区分++= 运算符并为它们提供单独的钩子(Hook); __add____iadd__ . list() 类型只是为后者提供了不同的实现。

列表单独实现这些更有效; __add__ 必须返回一个全新的列表,而 __iadd__ 可以扩展 self 然后返回 self

在C代码中,__iadd__是由list_inplace_concat()实现的,它只是调用 listtextend(),或者在 python 代码中调用 [].extend()。根据设计,后者采用任何序列。

另一方面,__add__ 方法在 C 中用 list_concat 表示, 只需要一个 list 作为输入,可能是为了效率的缘故;它可以直接遍历内部 C 数组并将项目复制到新列表。

总而言之,__iadd__ 接受任何序列的原因是因为当 PEP 203 (Augmented Add 提案)已实现,对于列表,最简单的方法是重用 .extend() 方法。

关于python - 列出扩展的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904039/

相关文章:

python - 从 Pandas 上传到 S3 时如何添加标签?

python - KineticJS toDataURL() 在 Python 中给出不正确的填充错误

python - Kivy:如何从一个 Canvas /屏幕移动到另一个 Canvas /屏幕?

python - Holoviews:如何用时间索引绘制 DataFrame

c# - 将 2 个带有内部列表的字典与 Diff 字典进行比较?

python - 如何将字典转换为按值排序的键列表?

java - 如何使用 Java Swing 制作可扩展列表

list - Prolog 列表合并问题?

python - 在 Django 模板中的元组列表的第一个元素中访问元组的第三项

python - 无法使用 gitpython 创建/添加新分支到 git repo