为什么eval('“\x27”')==eval('“\\x27”')?

2024-04-24 04:56:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python的eval()非常困惑:

我尝试了eval('"\x27"') == eval('"\\x27"'),结果是True。有人能解释一下为什么会这样吗?两个表达式的结果都是"'"。我理解eval('"\x27"')为什么会这样(被评估的字符串只有一个字符,它是一个转义的十六进制,表示撇号),但是eval('"\\x27"')不应该等于"\\x27"?在

其次,如果我设置以下变量

s = "\x27"
t = "\\x27"

那么eval('s')又是"'",但是{}是{}。为什么?在


Tags: 字符串true表达式eval字符x27
2条回答

根据文档,eval“将参数作为python表达式进行解析和求值”。换句话说,它所应用的处理与在程序或空闲程序中编写x = "foobar \n"时应用的处理相同。在这个例子中,\n变成了一个换行符(注意,它与文本\n不相同)。在

如果您在IDLE中输入x = "\x27",那么您将得到x == "'"。由于反斜杠,x27转义,因此在求值期间发生了变化。如果转义反斜杠,则x27在求值过程中是而不是更改的。相反,您只需得到一个带有反斜杠并后跟x27的字符串。在

现在,如果您再次计算该字符串,则只剩下一个反斜杠-似乎在转义x27。因此,它被改为'。在

另一种方法是:eval("\x27")计算参数两次,但它只在第一次更改为"'"eval("\\x27")还对参数求值两次,首先对\x27求值,然后对"'"求值。在


这里有一个更简单的例子来演示它的工作原理:

>>> x = "\"foobar\""
>>> x == "foobar"
False
>>> x == "\"foobar\""
True
>>> x = eval(x) # changes value of x from "foobar" to just foobar. Still string though, thus still ""
>>> x == "foobar"
True
>>> x == "\"foobar\""
False

请这样看:y = "2"的右侧包含两个组件:y应该是string类型的信息,使用两个"来表示,以及该字符串的,由字符2表示。这两个方面的分离是在您编写的代码的求值期间完成的。在初始化期间,string对象本身永远不会看到"。在

所以在上面的例子中,在第一行之后,我们有x,类型为str,值为"foobar"。如果您再次计算这个值,那么"这次不是作为x值的一部分,而是作为x类型。因此eval("\"foobar\"")基本上将字符串"foobar"转换为foobar,如果你想使用Python语言来使用它,你必须写为"\"foobar\""和{}。在

对于'"\x27"',反斜杠转义是在解析过程中展开的,因此这是字面意思 '"\'"''"\\x27"'只去掉反斜杠,即它等于r'"\x27"'。在

字符串文本上的直接eval()添加了另一个特殊字符扩展的迭代:在第一种情况下,\'是一个valid escape sequence生成{}。第二种情况同上。在

当使用变量名时,在赋值时只执行一轮的取消跳过。eval('s')只需扩展到s的值,而无需进一步取消。如果您想模拟第一种情况,您需要eval(s),即计算s引用的字符串的值。在

相关问题 更多 >