Python列表追加逻辑疑问:变量c为何影响列表b的内容?
筛选末尾为0的整数:代码逻辑解析与优化
你的问题
你生成了包含0到500所有整数的列表y,想要筛选出末尾数字为0的数,但搞不懂现有代码里变量c的作用——只有当c初始值为0时,列表b才会得到符合要求的数;修改c的初始值或者移除它,b就只会追加固定值或错误值。
你的代码
x = 0 y = [] while x <= 500: y.append(x) x = x + 1 a = 0 b = [] c = 0 # if i remove c from this or change c from 0 to 1 or any other number it just appends with that value # but if c is as i have it, it some how appends the list with the values i am pulling with my if statment while a <= 500: if int(repr(y[a])[-1]) == 0: b.append(c) a = a + 1 c = c + 1 print(len(b)) print(b)
代码逻辑拆解
生成列表
y的部分:
这段逻辑很直白,用while循环从0递增到500,把每个数依次加入y,最终y就是[0, 1, 2, ..., 500],且y[a]和a的值完全相等(比如y[0]=0,y[10]=10)。筛选部分的核心逻辑:
a是遍历y的索引,从0到500;c初始值为0,每次循环a和c都会同时加1,所以c和a的值始终完全相等。- 条件
int(repr(y[a])[-1]) == 0是把y[a]转成字符串后取最后一位,判断是否为0(也就是判断y[a]末尾是否为0)。当条件满足时,你执行b.append(c),而因为c=a=y[a],所以实际上是把符合要求的y[a]加入了b,这才得到了你想要的结果。
为什么修改/移除
c会出错:- 如果把
c的初始值改成1,那么c永远比a大1,满足条件时append(c)就会加入a+1,而不是y[a],结果全错; - 如果移除
c,你大概率会把append(c)改成某个固定值(比如append(0)),或者代码报错后随便填了个固定数,导致b里全是同一个值。
- 如果把
更简洁高效的写法
你的代码绕了弯路,其实有更直观的方式筛选末尾为0的数(末尾为0的数都是10的倍数,用取余运算%就能判断):
方法1:列表推导式(推荐)
# 直接生成0到500的列表,替代while循环 y = list(range(0, 501)) # 筛选出能被10整除的数 b = [num for num in y if num % 10 == 0] print(len(b)) print(b)
方法2:while循环优化版
x = 0 y = [] while x <= 500: y.append(x) x += 1 b = [] a = 0 while a <= 500: current_num = y[a] # 用取余判断是否为10的倍数,比转字符串更高效 if current_num % 10 == 0: b.append(current_num) a += 1 print(len(b)) print(b)
内容的提问来源于stack exchange,提问作者k3ramb1t
相关产品推荐
相关产品推荐

