s='s=%r;print(s%%s)';print(s%s)
我理解%是用s替换字符串中的东西(但实际上要替换谁?)
也许更有趣的是,为什么print(s%%s)
在print(s%s)
替换为%s
之后自动成为s
?
答案 0 :(得分:5)
您在该代码中看到的"%%"
是旧版printf-style of string formatting的“转化说明符”。
大多数转换说明符告诉Python如何转换传递给%
格式运算符的参数(例如,"%d"
表示在将下一个参数插入字符串之前将其转换为十进制整数)。
"%%"
不同,因为它直接转换为单个"%"
字符而不消耗参数。格式字符串规范中需要进行此转换,否则任何"%"
都将被视为其他代码的第一部分,并且没有简单的方法来生成包含百分号的字符串。
您显示的代码是一个quine(一个生成自己的代码作为输出的程序)。当它运行print(s%s)
时,它执行字符串格式化操作,其中格式字符串和单个参数都是相同的字符串s
。
字符串中的"%r"
是一个转换说明符,用于执行其参数的repr
。字符串上的repr
生成带有引号的字符串。这是引用字符串来自输出的地方。
"%%"
生成%
运算符,该运算符出现在s
调用中的两个print
之间。如果"%"
中只包含一个s
,则会出现关于格式化操作的错误,期望第二个参数(因为%s
是另一个转换说明符)。
答案 1 :(得分:1)
print '% %s' % '' #wrong
print '%% %s' % '' #correct and print '% '
想想\\和\。