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

Python函数动态创建指定名称列表报变量未定义如何解决

问题复现

你当前的代码如下,运行时抛出name 'LEVEL_001' is not defined错误:

import csv

def readLevel(filename,listname):
    listname=[]
    with open(filename, "r") as element:
        csv_reader = csv.reader(element)
        listname = list(csv_reader)

readLevel('level001.csv','LEVEL_001')
readLevel('level002.csv','LEVEL_002')

print(LEVEL_001)
print(LEVEL_002)

你的预期是编写一个接收文件名、列表名作为入参的函数,读取指定CSV文件内容并存入对应名称的列表,但当前函数内创建的列表无法绑定传入的列表名称,外部访问对应列表变量时提示名称未定义。

错误原因
  • 你传入的'LEVEL_001'、'LEVEL_002'是字符串值,不是实际的变量对象
  • Python函数的参数为对象引用传递,函数内部对listname变量重新赋值时,只会修改函数内部局部变量的指向,不会影响外部作用域的任何变量
  • 你从未在全局作用域定义过LEVEL_001、LEVEL_002这两个变量,外部访问自然会报未定义错误
推荐实现方案

不要尝试通过传字符串的方式动态创建变量,这是坏实践,会污染命名空间,提升后续排查问题的成本。最合理的写法是让函数直接返回读取到的CSV内容,外部用对应变量接收返回值即可:

import csv

def read_level(filename):
    with open(filename, "r", encoding="utf-8") as f:
        csv_reader = csv.reader(f)
        return list(csv_reader)

# 直接用目标变量接收函数返回结果
LEVEL_001 = read_level('level001.csv')
LEVEL_002 = read_level('level002.csv')

print(LEVEL_001)
print(LEVEL_002)
不推荐的动态变量实现(仅作原理说明)

如果你一定要实现传入字符串名称就自动生成对应全局变量的效果,可以通过操作全局变量字典globals()实现,但这种写法仅适合临时快速脚本,正式项目不要使用:

import csv

def read_level(filename, list_name):
    with open(filename, "r", encoding="utf-8") as f:
        csv_reader = csv.reader(f)
        globals()[list_name] = list(csv_reader)

read_level('level001.csv', 'LEVEL_001')
read_level('level002.csv', 'LEVEL_002')

print(LEVEL_001)
print(LEVEL_002)

内容的提问来源于stack exchange,提问作者Peter Adams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:33:11