python使用eval计算布尔值的问题

wh62592855 2012-08-22 01:07:09
if __name__ == "__main__":
code = compile("(var) and True", "", "eval")
var = "False or False"
exec code
print eval(code)
print eval("(False or False) and True")


大家好,上面这段代码运行的结果是
True
False

难道不是应该两次都为False才对吗?不明白为什么第一次在用eval计算时为True。

之前本来就是直接用eval来计算某个表达式的值的,后来发现效率比较低,就改为compile+eval的模式,下面这篇文章分析过这个问题。
http://lucumr.pocoo.org/2011/2/1/exec-in-python/
...全文
318 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wh62592855 2012-08-22
  • 打赏
  • 举报
回复
谢谢两位。
  • 打赏
  • 举报
回复

if __name__ == "__main__":
code = compile("(var) and True", "", "eval")
var = False or False #这里改传参数
exec code
print eval(code)
print eval("(False or False) and True")


这样效果就一样了
结果为
False
False
angel_su 2012-08-22
  • 打赏
  • 举报
回复
var = "False or False" 是个字符串来的,所以"False or False" and True为真
你认为的估计应该写成var = False or False,那么(False or False) and True为假
  • 打赏
  • 举报
回复
个人理解
cmpile()函数编译过后返回一个代码对象,形成了一个整体
val就被作为一个变量,后面传值时是字符串
也就是相当于 表达式变成了 (val) and True
传值后("False or False") and True
因为任意非空字符串 都可以当成True,所以结果就是True

而直接eval 则是编译成 (False or False)and True

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧