我对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".这是为什么?
根据文档,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"。
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |