吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 569|回复: 10
收起左侧

[学习记录] python中exec函数修改局部变量

[复制链接]
MyModHeaven 发表于 2024-2-16 21:59

前言:本文信息密度很低,是我边研究exec边写的

0. 摘要

本文内容如标题,办法在 4.2

1. 引子

代码中碰到一个问题,可简化为:

def calculate(calculate_rule):
    account = 0
    for c in calculate_rule:
        exec('account = 2')
        print(account)

我以为函数在控制台的输出应该为2,但实际上是0。

2. 原因

薅光头发没找到原因,问了一下文心一言,竟然给出了答案:

pFG6Lzd.png

在代码方面,以前也问过它,但总是没有满意答案,这次倒是让我意外

给出的解决办法是错的,后面会提到

3. 复现

以下部分均为个人推断,如果错误请指出,谢谢

如果我们没有指定exec中赋值的变量是全局变量还是局部变量,那么结果总是与我们希望的背道而驰。

3.1 exec想给全局变量赋值

3.1.1

account = 0

exec(f'account = 2')
print(account)

输出2,毫无疑问

3.1.2

account = 0
def f():
    exec(f'account = 2')
    print(account)
f()

输出0,因为exec语句中的account变量是局部变量,print语句中的是全局变量

3.1.3

account = 0
def f():
    exec(f'account = 2', globals())
    print(account)
f()

输出2,因为execprint语句中的account变量都是全局变量

3.2 exec想给局部变量赋值

3.2.1

account = 0

exec(f'account = 2')
print(account)

输出2,毫无疑问

3.2.2

def f():
    account = 0
    exec(f'account = 2')
    print(account)
f()

输出0,因为print语句中是局部变量,而exec语句中的account变量在全局变量和局部变量中都没有,不知道去哪了

3.2.3

def f():
    account = 0
    exec(f'account = 2', globals(), locals())
    print(account)
f()

如文心一言所言,这时候输出的应该是局部变量account,值为2,但实际上输出的值还是0。所以它说错了

4. 纠错

4.1 自行修改

https://docs.python.org/zh-cn/3/library/functions.html#exec

看到官方文档,exec(object, globals=None, locals=None, /, *, closure=None)exec有关键字参数,所以我改了一下,但是报错:

pFGRYmn.png

向文心一言发送报错内容,回答:

pFGWkNV.png

pFGWZ3F.png

至此,又碰壁。

4.2 询问文心一言

我问exec语句中如何修改局部变量,给出如下回答:

pFGcRk8.png

这次给的办法确实有效:

def f():  
    locals_dict = {'account': 0}  # 创建一个字典来存储局部变量  
    exec('locals_dict["account"] = 2')  # 修改字典中的值  
    account = locals_dict['account']  # 更新局部变量  
    print(account)  # 打印修改后的值  

f()  # 输出: 2

虽然其中还有一些疑问,而且也不知道文心一言说的还有没有错误,但问题终归是解决了

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

刘大富 发表于 2024-2-16 22:08
学习一下
Y0uD1 发表于 2024-2-16 23:13
janken 发表于 2024-2-16 23:46
Handratty 发表于 2024-2-17 00:36
学习一下,太及时有用了....
sai609 发表于 2024-2-17 06:08
exec函数:是个啥
wmwgi84 发表于 2024-2-17 09:27
感谢分享,学习一下了!
kolt1911 发表于 2024-2-17 10:00
可是新建的字典是不是也算一个局部变量,为什么不会被修改
wapjsx 发表于 2024-2-17 16:35
奇了怪了,既然你已经有了:
locals_dict["account"] = 2

为什么还要exec 一下呢???原因何在?
 楼主| MyModHeaven 发表于 2024-2-18 09:04
wapjsx 发表于 2024-2-17 16:35
奇了怪了,既然你已经有了:
locals_dict["account"] = 2

开头说了,这只是简化后的,实际的代码是这样的:
[Python] 纯文本查看 复制代码
def calculate(calculate_rule):
    local_vars = {'account': 0}
    for c in calculate_rule:
        try:
            exec(f'local_vars["account"] {c[0]}= source_data["{c[1]}"]["{c[2]}"]["account"]')
        except Exception as e:
            print(e)
    return local_vars["account"]
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-6 14:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表