【发布时间】:2021-12-31 17:44:03
【问题描述】:
在考虑创建列表的选项时,有列表推导式、list() 构造函数和 [] 文字语法。
我找到了一个article,它说列表推导被转换为在底层调用list.append() 的函数。
所以这给我的印象是 append() 在列表中的每次迭代中都会被调用,就像在类似的实现中说的那样,如果你愿意,你可以使用 for loop 来编写它。
但是,我现在找到了之前的 answer here on SO,上面写着:
列表理解版本利用了特殊的字节码 LIST_APPEND 直接为我们调用 PyList_Append。因此它避免了 list.append 的属性查找和 Python 中的函数调用 级别。
那么,当您编写如上面的正方形示例这样的列表推导式时,它是在每次迭代时调用append(),还是不调用?
相对于对 list.append() 的实际 c 级调用,对 list.append 的属性查找意味着什么?
【问题讨论】:
-
目前尚不清楚这个问题除了与您链接到的问题的重复之外还有什么其他意义。您似乎在问该问题中接受的答案是否有效。
-
不,完全没有质疑接受的答案的有效性!自从解决了我的困惑后,我已经改写了我的问题。
-
当代码中出现类似“squares.append”的东西时,总是需要检查“squares”是否是一个列表,并检索属性“append”引用的函数并做一些其他的事情。在列表推导中,运行时知道它正在处理一个列表,并且它知道应该使用列表的“追加”方法而不用查找它。
-
当您执行
some_object.whatever之类的属性查找 时,需要在运行时搜索该属性。请注意,您可以使用whatever = some_object.whatever完成相同的操作
标签: python