这是前几天偶尔碰到的问题, 发现跟自己的对python理解不一致, 于是网上搜了下, 说是Python的Bug, 正好最近在看python源码, 于是就通过源码分析了下.
1. 首先,说下问题:
"\"在python字符串中算特殊字符, 起转义作用, \n转义n变回车, \\转义\等等,这个应该没啥问题. 那么正常情况下a="\" 是存在语法问题, 因为\转义了右边的",所以字符串少一个右括号,错误原因很明显了. 但是,python(很作死的)有个r操作符(全称 原始字符串操作符), 就是对字符串内的内容按字面意思解析,不做特殊处理,所以如果a=r"\n" 输出的就是"\\n",而不是回车,为什么是"\\", goto 1 再看看. 那么现在问题来了, 按r的功能, a=r"\", 应该没问题,因为在r的场子里,\是不能转义",但是现在还是给你一个语法错误,syntaxError.
2. 然后,我想说:
其实我刚才说错了, 这不是一个语法错误, 这tmd是个词法错误.(略装B的说法,语法词法概念模糊的可以网上稍微看下). 为什么这么说, 跟了下python的源码,发现问题出在Parser\tokenizer.c内, python对字符串对象的词法解析部分.代码如下:
<p>/* String */</p><p><span style="font-family:宋体;font-size:14px;">letter_quote:</span>
if (c == '\'' || c == '"') {
Py_ssize_t quote2 = tok->cur - tok->start + 1;
int quote = c;
int triple