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
相关产品推荐
相关产品推荐

