Python报错NameError: name 'usr_name' is not defined的解决咨询
问题:修复NameError并实现将用户名添加到列表的需求
我想在while循环中收集所有通过usr_name定义的用户名,但运行代码时遇到了错误,尝试调整字符串和变量名也没解决,麻烦帮忙看看怎么修复?
我的代码:
#!/bin/usr/python3 import os, sys import math try: project_file = open('work_good.txt', 'w+') text = project_file.read() except FileNotFoundError: text = ('File not found') print (text) project_file.close() def Zone(): #Introduction to the database print ('WELCOME TO THE DATABASE', file=project_file) print (23*'=', file=project_file) def Username(): #Ask for users username usr_name = input ('What do you want your current username to be?: ').strip().capitalize() print ('Your username is: {}'.format(usr_name), file=project_file) while True: my_list = [] if usr_name in my_list: my_list.append(usr_name) Zone() Username()
运行时错误:
Traceback (most recent call last): File "project_work.py", line 27, in if usr_name in my_list: NameError: name 'usr_name' is not defined
解决方案
咱们一步一步来解决这些问题:
1. 先理清核心问题
- 变量作用域问题:
usr_name是Username()函数里的局部变量,函数外面的while循环根本拿不到它,这就是NameError的根源。 - 列表初始化位置错了:你把
my_list = []放在while循环里,每次循环都会重置成空列表,之前加的用户名全白存了。 - 代码执行顺序颠倒:现在是先跑while循环,再调用初始化和用户名输入的函数,完全搞反了流程。
- 文件提前关闭:你刚打开文件就close了,后面
Zone()和Username()里往文件写内容会直接报错。
2. 修改后的完整代码
#!/bin/usr/python3 import os, sys import math # 先初始化列表,放在循环外面才不会每次清空 my_list = [] def Zone(file_obj): # 把文件对象作为参数传进来,避免提前关闭的问题 print('WELCOME TO THE DATABASE', file=file_obj) print(23*'=', file=file_obj) def Username(): # 让函数返回输入的用户名,这样外部就能拿到 usr_name = input('What do you want your current username to be?: ').strip().capitalize() return usr_name try: # 用with语句自动管理文件,不用手动close,更安全 with open('work_good.txt', 'w+') as project_file: # 先执行初始化操作 Zone(project_file) while True: # 调用函数获取用户名 usr_name = Username() # 这里注意:你原来的逻辑是"如果用户名在列表里才添加",这应该是反了? # 如果要添加所有输入的用户名(包括重复),直接append就行 # 如果要去重,就改成if usr_name not in my_list: my_list.append(usr_name) # 把用户名写入文件 print(f'Your username is: {usr_name}', file=project_file) # 可以加个退出条件,不然循环停不下来 keep_going = input('Add another username? (y/n): ').strip().lower() if keep_going != 'y': break # 循环结束后可以打印一下所有收集到的用户名 print('All collected usernames:', my_list) except FileNotFoundError: print('File not found')
3. 关键修改说明
- 用
with语句管理文件:自动处理文件的打开和关闭,避免手动close导致的问题。 - 调整列表初始化位置:把
my_list = []放在while循环外面,确保所有输入的用户名都存在同一个列表里。 - 让
Username()返回值:这样外部就能拿到函数内部的usr_name变量,解决作用域问题。 - 调整执行顺序:先初始化文件内容,再进入循环收集用户名,逻辑更合理。
- 添加退出条件:原来的while循环是死循环,加个简单的输入判断让用户可以退出。
- 修正文件操作:把文件对象作为参数传给
Zone()函数,确保写入操作能正常执行。
内容的提问来源于stack exchange,提问作者Devin Rowe
相关产品推荐
相关产品推荐

