作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以在不操作求值字符串的情况下为“eval 表达式”赋值?示例:用户编写表达式
"globalPythonArray[10]"
它将计算出 globalPythonArray 的第 10 项的当前值。但目标是,将第 10 项的值设置为新值,而不是获取旧值。一个肮脏的解决方法是定义一个临时变量“newValue”并将评估字符串扩展为
"globalPythonArray[10] = newValue"
并编译并评估修改后的字符串。是否有一些低级 Python C API 函数可供我使用,这样我就不必操作评估字符串?
最佳答案
我想说可能不会,因为访问和存储订阅是不同的操作码:
>>> dis.dis(compile('globalPythonArray[10]', 'a', 'exec'))
1 0 LOAD_NAME 0 (globalPythonArray)
2 LOAD_CONST 0 (10)
4 BINARY_SUBSCR
6 POP_TOP
8 LOAD_CONST 1 (None)
10 RETURN_VALUE
<小时/>
>>> dis.dis(compile('globalPythonArray[10] = myValue', 'a', 'exec'))
1 0 LOAD_NAME 0 (myValue)
2 LOAD_NAME 1 (globalPythonArray)
4 LOAD_CONST 0 (10)
6 STORE_SUBSCR
8 LOAD_CONST 1 (None)
10 RETURN_VALUE
<小时/>
此外,在此处插入有关用户输入和 eval()
的常见警告:
globalPythonArray[__import__('os').system('rm -rf /')]
关于Python C API - 如何为 eval 表达式赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52116906/
我是一名优秀的程序员,十分优秀!