调用函数未接收返回值引发NameError?Python代码问题求助
在函数内调用另一个函数可行吗?为什么调用后拿不到返回值触发NameError?
函数内调用其他函数完全可行,你触发NameError的核心原因是没有接收被调用函数的返回值,且对变量作用域理解有误。
错误原因分析
在generate_passwords函数的循环里,你执行了generate_password(length),但没有把这个函数返回的密码字符串存到任何变量里。而password变量是定义在generate_password函数内部的局部变量,它的作用域仅限于generate_password函数内部,generate_passwords函数根本无法直接访问这个变量,所以会报错“name 'password' is not defined”。
修正后的代码
import random def generate_password(length): password = "" alpha_num = [i for i in 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'] # 修正循环条件,确保生成length位的密码(原<=会生成length+1位) while len(password) < length: symbol = random.choice(alpha_num) if symbol not in password: password += symbol return password def generate_passwords(count, length): passlist = [] for j in range(count): # 接收generate_password的返回值,赋值给password变量 password = generate_password(length) if password not in passlist: passlist.append(password) print(passlist) n, m = int(input()), int(input()) generate_passwords(n, m)
额外优化说明
- 将
import random移到文件顶部:避免在函数内部重复导入模块,符合Python代码规范 - 修正
generate_password的循环条件:原len(password) <= length会生成比指定长度多一位的密码,改成< length后会生成刚好length位的密码 - 移除了
generate_passwords里多余的import random:已经在顶部导入过,无需重复操作
内容的提问来源于stack exchange,提问作者Atagawa
相关产品推荐
相关产品推荐

