鱼C论坛

 找回密码
 立即注册
查看: 2067|回复: 11

[已解决]a=[1] b=[a[0]+a[1] for i in range(0)] 为什么b结果是空值?

[复制链接]
发表于 2021-1-30 01:45:16 | 显示全部楼层 |阅读模式

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

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

x
  1. >>> a=[1]
  2. >>> b=[a[0]+a[1] for i in range(0)]
  3. >>> b
  4. []
复制代码

a[0]  结果是1  
[a[1] for i in range(0)]结果是[]
为什么合起来  [a[0]+a[1] for i in range(0)]  结果是[]
我想了半天也没有搞明白为什么b是空值,他是怎么迭代计算出来的?麻烦解答一下,不胜感激!


最佳答案
2021-1-30 15:49:48
本帖最后由 hrp 于 2021-1-30 15:54 编辑
漫天疯语 发表于 2021-1-30 15:42
你的意思是说运算优先级的问题吗?
是不是[a[0]+a[1] for i in range(0)]和[(a[0]+a[1])for ...


原来你是优先级看错了,是的,优先级就是下面这样:
  1. b=[(a[0]+a[1]) for i in range(0)]
复制代码

这时因为循环0次,列表推导式生成元素0次,所以a[0]+a[1]根本不会被执行,随便写啥只要不是语法错误,列表都是空。


改成
  1. b=[(a[0]+a[1]) for i in range(1)]
复制代码

后,因循环1次,生成1个元素,生成元素时会执行a[0]+a[1]一次,当遇到a[1]就报错了,因为你的a只有一个元素a[0]。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-30 15:49:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hrp 于 2021-1-30 15:54 编辑
漫天疯语 发表于 2021-1-30 15:42
你的意思是说运算优先级的问题吗?
是不是[a[0]+a[1] for i in range(0)]和[(a[0]+a[1])for ...


原来你是优先级看错了,是的,优先级就是下面这样:
  1. b=[(a[0]+a[1]) for i in range(0)]
复制代码

这时因为循环0次,列表推导式生成元素0次,所以a[0]+a[1]根本不会被执行,随便写啥只要不是语法错误,列表都是空。


改成
  1. b=[(a[0]+a[1]) for i in range(1)]
复制代码

后,因循环1次,生成1个元素,生成元素时会执行a[0]+a[1]一次,当遇到a[1]就报错了,因为你的a只有一个元素a[0]。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-30 02:00:16 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2021-1-30 02:02 编辑

重点是range(0),循环0次,列表b当然是空的。
就算你改为不是range(0),也会报错,因为你定义a=[1],a[1]已经超出索引范围了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-30 02:22:47 | 显示全部楼层
hrp 发表于 2021-1-30 02:00
重点是range(0),循环0次,列表b当然是空的。
就算你改为不是range(0),也会报错,因为你定义a=[1],a[1] ...

是的,b=[a[1] for i in range(0)]结果为空我理解
但是为什么b=[a[0]+a[1] for i in range(0)]为空?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-30 09:22:14 From FishC Mobile | 显示全部楼层
漫天疯语 发表于 2021-1-30 02:22
是的,b=[a[1] for i in range(0)]结果为空我理解
但是为什么b=[a[0]+a[1] for i in range(0)]为空?

有区别吗,不都是循环0次
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-30 09:32:21 | 显示全部楼层
b = [1 + '乱写东西也为空 因为根本就没有生成列表' for i in range(0)]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-30 10:25:32 From FishC Mobile | 显示全部楼层
漫天疯语 发表于 2021-1-30 02:22
是的,b=[a[1] for i in range(0)]结果为空我理解
但是为什么b=[a[0]+a[1] for i in range(0)]为空?

仔细看我的上一个回答好吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-30 12:07:30 From FishC Mobile | 显示全部楼层
hrp 发表于 2021-1-30 02:00
重点是range(0),循环0次,列表b当然是空的。
就算你改为不是range(0),也会报错,因为你定义a=[1],a[1] ...

大佬,你说的其实我也不是很理解
是不是就是说0循环次数,不执行a[0]+a[1],所以b=[]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-30 13:24:41 From FishC Mobile | 显示全部楼层
basketmn 发表于 2021-1-30 12:07
大佬,你说的其实我也不是很理解
是不是就是说0循环次数,不执行a[0]+a[1],所以b=[]

循环0次,没有执行将元素添加到列表中的动作,a[0]+a[1]也不会被执行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-30 15:42:29 | 显示全部楼层
hrp 发表于 2021-1-30 13:24
循环0次,没有执行将元素添加到列表中的动作,a[0]+a[1]也不会被执行。


你的意思是说运算优先级的问题吗?
是不是[a[0]+a[1] for i in range(0)]和[(a[0]+a[1])for i in range(0)]是一样的
还是说 [1 + '乱写东西也为空 因为根本就没有生成列表' for i in range(0)]也为[]?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-30 16:47:40 | 显示全部楼层
hrp 发表于 2021-1-30 15:49
原来你是优先级看错了,是的,优先级就是下面这样:

这时因为循环0次,列表推导式生成元素0次,所以 ...

理解满分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-30 16:50:28 | 显示全部楼层
漫天疯语 发表于 2021-1-30 15:42
你的意思是说运算优先级的问题吗?
是不是[a[0]+a[1] for i in range(0)]和[(a[0]+a[1])for ...

只要不是语法错误(NameError 之类的)列表都为空
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-28 11:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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