Python 把 ['"qwen-turbo","qwen-plus","deepseek"]' 转成真正的 list:3 种方法 + 避坑指南

面试、写接口、读配置时经常会遇到这种场景:从数据库、接口、配置文件里拿到一个看起来像列表、其实还是字符串的值。比如:


直接当 list 用会踩坑。这篇就讲清楚:它到底是什么、为什么不能直接用、以及最安全的几种转换方式。

一、先看清它到底是什么类型

很多人以为 print 出来是 [...] 就是列表了,其实不是。raw_str 外面那对单引号说明它是 字符串(str),里面的 [...] 只是字符串里的字符。


如果你直接拿它当下标访问、遍历,结果会和你预期完全不一样:


我们要的是 ["qwen-turbo", "qwen-plus", "deepseek"] 这样一个真正的 list。下面三种方法都能做到。

二、方法一:json.loads()(最推荐)

这个字符串本身就是一个合法的 JSON 数组(注意里面用的是双引号 "),所以直接用标准库 json 解析最干净:


优点:标准、安全、零依赖(Python 自带),解析 JSON 文本的首选。

三、方法二:ast.literal_eval()(兼容单引号)

如果字符串里用的是单引号(Python 列表写法),json.loads 会报错,因为 JSON 只认双引号。这时用 ast.literal_eval 更通用——它专门用来"安全地求值 Python 字面量"(list、dict、tuple、数字、字符串等)。


它连单引号写法也能吃:


优点:比 eval 安全得多,只认"字面量",不会执行任意代码;对单/双引号都兼容。 ⚠️ 注意:它不是 JSON 解析器,遇到真正的 JSON 数字精度或 true/false/null 时语义略有差异,但转普通 list 完全够用。

四、方法三:eval()(能用,但别用!)

eval 也能转,但强烈不推荐


问题在于 eval执行字符串里的任意 Python 代码。如果这个字符串来自外部输入(用户、接口、数据库),别人传一句 __import__('os').system('rm -rf /') 就能搞破坏:


结论:除非你 100% 信任这段字符串的来源,否则永远不要用 eval 做这种转换。

五、单引号 vs 双引号:用哪个方法?

这是最容易踩的坑,记住规律就行:

字符串写法

json.loads

ast.literal_eval

双引号 "a","b"(JSON 风格)

✅ 可用

✅ 可用

单引号 'a','b'(Python 风格)

❌ 抛 JSONDecodeError

✅ 可用


💡 经验法则:不确定来源格式时,优先 json.loads;如果报错了再退回 ast.literal_eval

六、封装一个"怎么都吃得下"的安全工具函数

实际项目里,字符串可能来自不同地方、格式还不统一。封装一个小函数,先试 JSON、再试字面量、最后兜底按逗号拆,最省心:


七、三种方法对比总结

方法

安全性

单引号

推荐度

适用场景

json.loads

⭐⭐⭐⭐⭐

字符串是标准 JSON(双引号)

ast.literal_eval

⭐⭐⭐⭐

字符串是 Python 字面量(单/双引号都行)

eval

低(有注入风险)

仅在完全信任来源时临时用,正式代码别用

八、常见坑速查

  • 🚫 以为 print 出来是 [...] 就是 list —— 先看 type()
  • 🚫 单引号字符串用 json.loadsJSONDecodeError —— 换 ast.literal_eval
  • 🚫 用 eval 转换外部输入 —— 有代码注入风险;
  • 🚫 字符串前后有空格/换行导致解析失败 —— 先 .strip()
  • ✅ 最稳姿势:封装上面的 str_to_list(),一劳永逸。

九、一句话总结

字符串 '["qwen-turbo","qwen-plus","deepseek"]' 转 list,首选 json.loads,兼容单引号用 ast.literal_eval,千万别用 eval

如果是从接口或数据库里批量读这种字段,直接把 str_to_list 封装成工具函数,全项目复用即可。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐