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

时间:2018-07-03 15:46:10

标签: python python-3.x

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

我尝试了eval('"\x27"') == eval('"\\x27"'),其结果为True。有人可以解释为什么会这样吗?这两个表达式的取值为"'"。我知道为什么eval('"\x27"')会这样做(所评估的字符串只有一个字符,这是一个表示撇号的转义十六进制),但是eval('"\\x27"')不应等于"\\x27"吗?

第二,如果我设置以下变量,会增加混乱,

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

然后eval('s')再次是"'",但是eval('t')"\\x27"。为什么会这样?

2 个答案:

答案 0 :(得分:3)

根据文档,eval“将参数解析并评估为python表达式”。换句话说,它采用与在程序或IDLE中写入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应该是字符串类型的信息,用两个"表示,而<该字符串的em> value ,由字符2表示。这两个方面的分离是在您编写的代码的评估中完成的。初始化期间,字符串对象本身从未看到"

因此,在上面的示例中,在第一行之后,我们有类型为x的{​​{1}},值为str。如果再次评估该 ,则这次将"foobar"解释为不是" value 的一部分,而是解释为 type < / em>之x。因此x基本上将 string eval("\"foobar\"")转换为"foobar",如果要使用Python语言使用该字符串,则必须写为{{1 }}和foobar

答案 1 :(得分:1)

对于<div id="carouselExampleControls" class="carousel slide" data-ride="carousel"> <div class="carousel-inner"> <div class="carousel-item active"> <img class="d-block w-100" src="images/pic03.jpg" alt="First slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src="images/pic01.jpg" alt="Second slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src="images/pic02.jpg" alt="Third slide"> </div> </div> <a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev"> <span class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="sr-only">Previous</span> </a> <a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next"> <span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="sr-only">Next</span> </a> </div> ,反斜杠转义在解析过程中会扩展,因此这实际上是 '"\x27"''"\'"'仅去除反斜杠,即等于'"\\x27"'

在字符串文字上直接使用r'"\x27"'会增加另一次特殊字符扩展:在第一种情况下,eval()valid escape sequence,产生\'。第二种情况与上述相同。

使用变量名时,分配值时仅执行一轮转义。 '仅扩展为eval('s')的值,而无需进一步转义。如果要模拟第一种情况,则需要s,即评估eval(s)引用的字符串的值。