我对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
求值过程中发生了变化。如果转义反斜杠,那么在求值过程中不会改变。相反,您只需得到一个带有反斜杠后跟 的字符串。x27
x27
现在,如果您再次评估该字符串,您会发现只剩下一个反斜杠——看起来是转义的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 次 |
最近记录: |