You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:43:07