为什么eval('"\ x27"')== eval('"\\ x27"')?

tit*_*ree 6 python python-3.x

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

我试过eval('"\x27"') == eval('"\\x27"'),它评估为True.有人可以解释为什么会这样吗?两个表达式都评估为"'".我理解为什么eval('"\x27"')(评估的字符串有一个字符,这是一个表示撇号的转义十六进制),但不eval('"\\x27"')应该等于"\\x27"

其次,加上混乱,如果我设置以下变量,

s = "\x27"
t = "\\x27"
Run Code Online (Sandbox Code Playgroud)

然后eval('s')又是"'",但是eval('t')"\\x27".这是为什么?

Nea*_*roo 3

根据文档,eval“将参数解析并评估为 python 表达式”。换句话说,它应用的处理与您在x = "foobar \n"程序或 IDLE 内部编写时所应用的处理相同。在此示例中,\n被转换为换行符(请注意,它与文字不同\n)。

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

现在,如果您再次评估该字符串,您会发现只剩下一个反斜杠——看起来是转义的x27。因此,它被更改为'

另一种看待这个问题的方法是:eval("\x27")对参数求值两次,但只在第一次更改为"'"eval("\\x27")还对参数求值两次,首先是 to \x27,然后是 to "'"


这是一个更简单的示例来演示其工作原理:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

因此,在上面的示例中,在第一行之后,我们的x类型str为 value "foobar"如果您再次对其求值,"这次将不会被解释为 的的一部分x,而是被解释为的类型x。所以eval("\"foobar\"")基本上将字符串 "foobar"转换为foobar,如果你想使用 Python 语言来使用它,你必须写为"\"foobar\"""foobar"