使用列表推导生成随机列表后出现除零错误的技术问询
问题分析与解决方案
你遇到的“除以零”错误,核心原因是变量作用域混淆导致的。让我拆解一下问题:
- 你在全局作用域定义了一个空列表
v = []; - 但
generate_v()函数里的v是局部变量——它和全局的v是完全独立的两个变量,函数内部的赋值不会改变全局的空列表; - 当你调用
avg_v()时,它访问的是全局的那个空列表,len(v)为0,自然触发了除以零的错误。
另外提一句:你代码里的random.randint(0,100)和你需求的“1到20之间的随机数”不符,下面的修正代码会顺便调整这个点,如果是笔误可以按需修改。
方案一:利用函数返回值(推荐,更符合编程规范)
这种方式避免全局变量的耦合,让函数职责更清晰:
import random def generate_v(): # 直接返回1-20之间的100个随机数列表 return [random.randint(1, 20) for _ in range(100)] def avg_v(num_list): # 接收列表作为参数,计算平均值 return sum(num_list) / len(num_list) # 生成列表并赋值给变量 v = generate_v() print("生成的随机数列表:", v) print("列表平均值:", avg_v(v))
方案二:使用全局变量(不推荐,耦合性高)
如果你坚持要使用全局变量,需要在函数内部用global关键字声明要使用全局的v:
import random v = [] def generate_v(): global v # 声明该函数使用全局作用域的v变量 v = [random.randint(1, 20) for _ in range(100)] return v def avg_v(): return sum(v) / len(v) # 先调用generate_v修改全局v,再计算平均值 generate_v() print("生成的随机数列表:", v) print("列表平均值:", avg_v())
这样修改后,程序就能正确获取生成列表的长度并计算平均值了。
内容的提问来源于stack exchange,提问作者Luís Lopes
相关产品推荐
相关产品推荐

