我对python的eval()非常困惑:
我尝试了eval('"\x27"') == eval('"\\x27"')
,其结果为True
。有人可以解释为什么会这样吗?这两个表达式的取值为"'"
。我知道为什么eval('"\x27"')
会这样做(所评估的字符串只有一个字符,这是一个表示撇号的转义十六进制),但是eval('"\\x27"')
不应等于"\\x27"
吗?
第二,如果我设置以下变量,会增加混乱,
s = "\x27"
t = "\\x27"
然后eval('s')
再次是"'"
,但是eval('t')
是"\\x27"
。为什么会这样?
答案 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)
引用的字符串的值。