我对python的eval()非常困惑:
我尝试了eval('"\x27"') == eval('"\\x27"')
,结果是True
。有人能解释一下为什么会这样吗?两个表达式的结果都是"'"
。我理解eval('"\x27"')
为什么会这样(被评估的字符串只有一个字符,它是一个转义的十六进制,表示撇号),但是eval('"\\x27"')
不应该等于"\\x27"
?在
其次,如果我设置以下变量
s = "\x27"
t = "\\x27"
那么eval('s')
又是"'"
,但是{}是{}。为什么?在
Tags:
根据文档,
eval
“将参数作为python表达式进行解析和求值”。换句话说,它所应用的处理与在程序或空闲程序中编写x = "foobar \n"
时应用的处理相同。在这个例子中,\n
变成了一个换行符(注意,它与文本\n
不相同)。在如果您在IDLE中输入
x = "\x27"
,那么您将得到x == "'"
。由于反斜杠,x27
被转义,因此在求值期间发生了变化。如果转义反斜杠,则x27
在求值过程中是而不是更改的。相反,您只需得到一个带有反斜杠并后跟x27
的字符串。在现在,如果您再次计算该字符串,则只剩下一个反斜杠-似乎在转义
x27
。因此,它被改为'
。在另一种方法是:
eval("\x27")
计算参数两次,但它只在第一次更改为"'"
。eval("\\x27")
还对参数求值两次,首先对\x27
求值,然后对"'"
求值。在这里有一个更简单的例子来演示它的工作原理:
请这样看:
y = "2"
的右侧包含两个组件:y
应该是string类型的信息,使用两个"
来表示,以及该字符串的值,由字符2
表示。这两个方面的分离是在您编写的代码的求值期间完成的。在初始化期间,string对象本身永远不会看到"
。在所以在上面的例子中,在第一行之后,我们有}。在
x
,类型为str
,值为"foobar"
。如果您再次计算这个值,那么"
这次不是作为x
的值的一部分,而是作为x
的类型。因此eval("\"foobar\"")
基本上将字符串"foobar"
转换为foobar
,如果你想使用Python语言来使用它,你必须写为"\"foobar\""
和{对于
'"\x27"'
,反斜杠转义是在解析过程中展开的,因此这是字面意思'"\'"'
。'"\\x27"'
只去掉反斜杠,即它等于r'"\x27"'
。在字符串文本上的直接}。第二种情况同上。在
eval()
添加了另一个特殊字符扩展的迭代:在第一种情况下,\'
是一个valid escape sequence生成{当使用变量名时,在赋值时只执行一轮的取消跳过。
eval('s')
只需扩展到s
的值,而无需进一步取消。如果您想模拟第一种情况,您需要eval(s)
,即计算s
引用的字符串的值。在相关问题 更多 >
编程相关推荐