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

Python中exec()函数执行字符串异常问题求助

问题分析:exec执行后list输出为类而非预期列表

问题场景

编写了如下Python代码,blarg.txt文件内容为[1234,2345,2345,2345]。运行时print(read)正确输出字符串[1234,2345,2345,2345],print(tbe)正确输出字符串list = [1234, 2345, 2345, 2345],但exec(tbe)执行后print(list)输出<class 'list'>,而非预期的列表[1234,2345,2345,2345]。

原代码

def servlistappend(x):
    file = open("blarg.txt",'r')
    read = str(file.read())
    print(read)
    tbe = "list = "+read
    print(tbe)
    exec(tbe)
    print(list)
    list.append(x)
    print(list)
    file.close()
    file = open("blarg.txt",'w')
    file.write(str(list))
    file.close()
def servlistremove(x):
    file = open("blarg.txt",'r')
    read = str(file.read())
    print(read)
    tbe = "list = "+read
    print(tbe)
    exec(tbe)
    print(list)
    if x in list:
        list.remove(x)
    else:
        print("that element does not exist")
    print(list)
    file.close()
    file = open("blarg.txt",'w')
    file.write(str(list))
    file.close()
servlistremove(2345)

原因解析

核心问题是函数内部使用exec时,未指定局部作用域,导致你试图创建的list变量没有被绑定到当前函数的局部命名空间。

Python函数的局部变量在编译阶段就已确定,exec默认的作用域规则无法突破这个限制——你以为exec(tbe)创建了局部变量list,但实际上这个变量并没有被函数的局部命名空间识别。后续访问的list是Python内置的list类对象,所以打印出<class 'list'>。

解决方案

方案1:给exec指定局部作用字典

显式传入局部作用域字典,让exec把变量写入这个字典,之后从字典中取出使用:

def servlistremove(x):
    file = open("blarg.txt",'r')
    read = file.read().strip()  # 去除冗余空白,避免解析问题
    print(read)
    tbe = "list_var = " + read
    print(tbe)
    local_vars = {}
    # 显式传入全局和局部作用域
    exec(tbe, globals(), local_vars)
    list_var = local_vars['list_var']
    print(list_var)
    if x in list_var:
        list_var.remove(x)
    else:
        print("that element does not exist")
    print(list_var)
    file.close()
    file = open("blarg.txt",'w')
    file.write(str(list_var))
    file.close()

这里把变量名改为list_var,避免和内置list类型重名,也能减少混淆。

方案2:用ast.literal_eval替代exec(推荐)

exec执行字符串代码存在安全风险,若文件内容被篡改,可能执行恶意代码。推荐使用ast.literal_eval,它专门用于安全解析Python字面量(比如列表、字典等):

import ast

def servlistremove(x):
    file = open("blarg.txt",'r')
    read = file.read().strip()
    print(read)
    # 直接将字符串解析为列表对象
    list_var = ast.literal_eval(read)
    print(list_var)
    if x in list_var:
        list_var.remove(x)
    else:
        print("that element does not exist")
    print(list_var)
    file.close()
    file = open("blarg.txt",'w')
    file.write(str(list_var))
    file.close()

这个方法既规避了exec的作用域问题,又保证了代码安全性,是处理此类场景的最优选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:40:57