目录
1. 获取变量名
from u_工具 import to_变量名
a = 1
print(to_变量名(a))
2. 修改local变量
2.0. 预期效果
将变量a的值改成5
def main():
a = 2
def func():
nonlocal a
a = 5
func()
print(a)
main()
2.1. 利用 PyFrame_LocalsToFast 函数
缺点:这函数快被官方弃了
import sys
from u_工具 import to_变量名
from u_工具 import change_locals
def main():
a = 2
修改表 = {to_变量名(a): 5}
change_locals(sys._getframe(), 修改表)
print(a)
main()
2.2. 直接使用 globals
缺点:只能修改全局变量
a = 1
def main():
globals()["a"] = 5
main()
print(a)
2.3. 利用 memmove 函数
缺点:用到的两个值,占用空间要相同大小
import ctypes
def main():
a = 2
def func(a_id):
b = 5
ctypes.memmove(a_id,id(b),object.__sizeof__(b))
func(id(a))
print(a)
main()
u. 工具类
import re
import traceback
import ctypes
__to_变量名__pattren = pile(r'[\W+\w+]*?to_变量名\((\w+)\)')
__to_变量名__变量名集 = []
# 1.获取变量名
def to_变量名(变量):
global __to_变量名__变量名集
if not __to_变量名__变量名集:
__to_变量名__变量名集 = __to_变量名__pattren.findall(traceback.extract_stack(limit=2)[0][3])
return __to_变量名__变量名集.pop(0)
# 2.修改local变量
def change_locals(frame, 修改表={}):
frame.f_locals.update(修改表)
ctypes.pythonapi.PyFrame_LocalsToFast(
ctypes.py_object(frame),
ctypes.c_int(0)
)
python3 全局变量 局部变量_Python3获取变量名并修改函数内部的外部变量和局部变量 python3 在 local...