我使用2条类似的命令获得2条不同的输出:
>>> inp = 'print("hi")'
>>> print(eval(inp))
hi
None
>>> eval(inp)
hi
如何使print(eval(inp))
仅打印“ hi”?为什么还不打印?
答案 0 :(得分:3)
因此,当您进行print(eval('print("hi")'))
时,会发生以下情况:
eval()
被调用,参数为'print("hi")'
print("hi")
被执行"hi"
被打印到控制台上print()
返回None
。'print("hi")'
,eval()
函数记录了该函数的返回调用。哪个是None
。eval()
返回None
,因为那是它运行的代码的结果。print()
调用应该打印返回的eval()
函数。现在看起来像print(None)
。None
已打印到控制台。 tl; dr,print()
被称为两次不同的时间。因此,将打印两种不同的内容:第一次"hi"
,第二次None
。
如果您只想打印"hi"
,则可以执行eval('print("hi")')
-或执行print(eval("hi"))
,因为在这种情况下eval()
将返回{{1 }},这就是要打印的内容。在任何一种情况下,您将只执行一条打印语句。
尽管,一般来说,请勿对任何东西使用"hi"
。它极富风险,容易出错,可能会完全破坏您的程序,并且您无法对放入其中的代码做任何事情。使用eval()
的唯一可行原因是动态响应用户生成的代码,这是一个糟糕的主意,因为它允许代码注入。用户不应该这样做。