gpt4 book ai didi

虚拟名称与迭代器名称 : ill-advised? 相同的 Python 列表理解

转载 作者:太空狗 更新时间:2023-10-29 20:41:36 25 4
gpt4 key购买 nike

假设我做了一个看起来像这样的列表理解:

i = range(5)
a = [f(i) for i in i]

对于某些函数 f。使用与迭代器相同的虚拟名称是否会产生意想不到的结果?有时我的变量名是单独的字母,对我来说坚持使用同一个字母比分配一个新字母更具可读性,比如 [f(x) for x in x] 而不是[f(i) for i in x](例如,如果迭代器 x 的字母 有意义,我会想知道哎呀 i 是)。

最佳答案

TL;DR:它在技术上是安全的,但在风格上是一个糟糕的选择。

在列表理解中,在将 for 循环的自由变量绑定(bind)到任何对象之前,Python 将在可迭代对象上使用 GET_ITER 操作码来获取迭代器。这只在循环开始时一次完成。

因此,在列表理解的“循环”主体中(实际上在 Python 3 中创建了一个范围),您可以重新绑定(bind)最初指向可迭代对象的名称,而不会产生任何后果。迭代直接处理对 iterator 的引用,它是否在范围内有名称是无关紧要的。这在 Python 2 中也应该适用,尽管作用域实现细节不同:集合的名称在理解后将丢失,因为循环变量名称将保持绑定(bind)到迭代的最终元素。

这样写代码没有任何优势,而且比仅仅避免名称冲突更不利于可读性。因此,您应该更愿意为集合命名,以便更明显地表明它是一个集合:

[f(x) for x in xs]

关于虚拟名称与迭代器名称 : ill-advised? 相同的 Python 列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43725990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com