【发布时间】:2023-03-08 02:55:01
【问题描述】:
说,我有一些带变量的作用域,在这个作用域中调用的函数想要改变一些不可变的变量:
定义外部(): s = 'qwerty' n = 123 调整() 定义修改(): s = 'abcd' n = 456是否有可能以某种方式访问外部范围?类似于来自 Py3k 的 nonlocal 变量。
当然,在这种情况下我可以使用s,n = modify(s,n),但是如果我需要一些通用的“注入”来执行并且必须能够重新分配给任意变量怎么办?
我考虑到了性能,所以,如果可能的话,eval 和堆栈帧检查是不受欢迎的 :)
UPD:不可能。时期。但是,有一些选项如何访问外部范围内的变量:
- 使用全局变量。顺便说一句,
func.__globals__是一个可变字典;) - 将变量存储在 dict/class-instance/任何其他可变容器中
- 将变量作为参数并将它们作为元组返回:
a,b,c = innerfunc(a,b,c) - 注入其他函数的字节码。这可以通过
byteplaypython 模块实现。
【问题讨论】:
-
这不是作用域的工作方式。您要求访问不同堆栈帧上的范围。如果作用域允许您在此处尝试的操作,那将是非常令人困惑,考虑将尾递归重写为循环。所以代码优化突然会改变程序的含义,这永远不会发生。