鱼C论坛

 找回密码
 立即注册
查看: 28|回复: 2

请教列表推导式嵌套中的运行顺序

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我在看书中发现列表推导式的嵌套形式,例子如下:

[[[i,j] for j in range(1,4)] for i in range(5,8)]
运行结果: [[[5, 1], [5, 2], [5, 3]], [[6, 1], [6, 2], [6, 3]], [[7, 1], [7, 2], [7, 3]]]

如果把for语句中的i, j顺序调换
[[[i,j] for i in range(1,4)] for j in range(5,8)]
运行结果却变为: [[[1, 5], [2, 5], [3, 5]], [[1, 6], [2, 6], [3, 6]], [[1, 7], [2, 7], [3, 7]]]

这里我有点搞不懂列表推导式以上述嵌套形式编写时,这里的运算顺序是什么?到底是先运行最里面括号中的for循环语句,还是先运行括号外的for循环语句?望指点!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
在列表推导式中,嵌套的运行顺序确实是一个常见的困惑点。下面是列表推导式的基本运行顺序解析:

1. **结构理解**:在列表推导式 `[[表达式 for j in range(1,4)] for i in range(5,8)]` 中,它实际的结构是:
   - 外层的 `for i in range(5,8)` 控制生成几个列表(在这个例子中是3个,因为 `range(5,8)` 产生3个元素:5, 6, 7)。
   - 内层的 `for j in range(1,4)` 控制生成每个内层列表中的元素数量(在这个例子中是3个,因为 `range(1,4)` 产生3个元素:1, 2, 3)。

2. **运行顺序**:
   - 先执行外层的 `for i in range(5,8)`,这会先确定要执行多少次内层循环。
   - 然后对于每一个外层的 `i`,执行一次整个内层的列表推导式 `[表达式 for j in range(1,4)]`。
   - 内层的 `for j in range(1,4)` 以通常的方式执行,从1到3,生成每个内层列表的元素。

3. **变量的使用**:在表达式中,通常会用 `i` 和 `j` 来生成每个元素,比如 `[j for j in range(1,4)]` 结果为 `[1, 2, 3]`。如果需要用到外层循环 `i` 的值,可以在表达式中引用它,比如 `[i * j for j in range(1,4)]`。

如果把 `i` 和 `j` 的循环位置调换,如 `[[表达式 for i in range(1,4)] for j in range(5,8)]`,那么:
- 外层的 `for j in range(5,8)` 决定生成多少个内层列表(仍然是3个)。
- 内层的 `for i in range(1,4)` 决定每个内层列表的元素数量和其取值。

通过这几点的理解,写列表推导式的时候理清楚哪个循环是外层,哪个是内层,非常重要!希望这些说明能帮助你更好地理解列表推导式的运行顺序。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 20:03 | 显示全部楼层
最右边就是最外层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 02:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表