为何Python的eval()处理文件字符串可正确统计转义字符?
问题原因解析
核心差异就是:Python交互窗口直接输入的字符串,和从文件读进来的字符串,经历的转义处理次数不一样
1. 交互窗口输入的字符串:被提前转义了一遍
当你在交互Shell里敲"byc\x9dyxuafof\\\xa6uf\\axfozomj\\olh\x6a"这种字符串时,Python会先把它当成自己的代码字面量,自动做转义处理:
- 像
\x9d、\x6a这种开头的序列,直接转成对应的单个字符; - 每两个
\\会被合并成一个\; - 如果转义后出现无效格式(比如单独的
\a、或者没写完的\xa),直接触发SyntaxError。
这时候你查'\\' in 字符串,其实是在找两个连在一起的反斜杠,但原来的\\已经被转成单个\了,自然找不到,返回False。
2. 从文件读的字符串:是原封不动的原始内容
用open()读文件里的行时,Python不会修改任何字符,文件里写的啥就是啥:
- 文件里的每个
\都会原封不动变成字符串里的单个\; - 像
\x9d这种序列,会被当成\、x、9、d四个独立字符存着。
这时候:
line.count('\\')数的就是文件里所有\的个数,所以能得到正确的9;- 调用
eval(line),相当于让Python把这个原始字符串当成代码字面量再转义一遍,这正好符合题目要求的“把代码里的字符串转成实际数据字符串”的逻辑,所以能算出正确的长度。
举个简单例子对比
比如文件里写一行:"aaa\"aaa"
- 读出来的
line就是原封不动的'"aaa\\"aaa"'(这里Python显示时用\\代表实际的单个\); line.count('\\')返回1,对应文件里的那个\;eval(line)转义后得到实际字符串aaa"aaa,长度7,和题目例子一致。
但要是直接在交互窗口输入"aaa\"aaa",Python会直接转成aaa"aaa,原始的引号和转义符都没了,根本没法统计代码字符数。
内容的提问来源于stack exchange,提问作者Wpythonic
相关产品推荐
相关产品推荐

