这里的print(s%%s)是什么意思?

5
s='s=%r;print(s%%s)';print(s%s)

我理解百分号(%)是用于在字符串中替换某些内容的(但实际上要替换什么?)。更有意思的是,为什么在将%s替换为s本身之后,print(s%%s)自动变成了print(s%s)

我改变了问题,现在它会询问%%s。 - bozeng
1
在格式化字符串中,%% 表示一个百分号 % - Dan D.
1
考虑 "%s%%s" % 'follow me ' => 'follow me %s' - Dan D.
C语言中使用格式字符串传递给printf函数。尽管有些字母的用法不同。 - Dan D.
bozeng正在询问有关Python中的格式化操作符,例如formatstring % formatitems,而不是在格式化字符串字段内使用%的情况:“%s%5.2f”。 - smci
显示剩余4条评论
2个回答

6
在这段代码中,你看到的"%%"是旧版printf格式化字符串的“转换说明符”。
大多数转换说明符告诉Python如何将传递给%格式运算符的参数进行转换(例如,"%d"表示在插入字符串之前将下一个参数转换为十进制整数)。 "%%"不同,因为它直接转换为单个"%"字符而不消耗任何参数。在格式字符串规范中需要此转换,否则任何"%"都将被视为其他代码的第一部分,并且没有简单的方法来生成包含百分号的字符串。
您展示的代码是一个Quine(一种生成自身代码作为输出的程序)。当运行print(s%s)时,它执行了一个字符串格式化操作,其中格式字符串和单个参数都是相同的字符串s
字符串中的"%r"是一个转换说明符,用于对其参数进行repr。字符串上的repr会在其周围添加引号。这就是输出中带引号的字符串的来源。 "%%"生成出现在print调用中两个s之间的%运算符。如果s中只包含一个"%",则会出现关于格式化操作需要第二个参数的错误(因为%s是另一个转换说明符)。

我同意你的观点。但需要注意的是,如果直接使用"%%"并打印输出,它会被解释为双倍百分号。例如:print("%%"),然后查看输出结果。 - bozeng
这意味着它的行为在至少打印和格式化打印方面不一致。 - bozeng
你是对的,单独使用 "%%" 只是一个包含两个百分号的字符串。只有当你将其用作格式化字符串时,这两个字符才会变成一个。尝试使用 "%%" % () 格式化没有参数的字符串,你就会看到它发生了。 - Blckknght

2
print '% %s' % '' #wrong
print '%% %s' % '' #correct and print '% '

思考一下 \\ 和 \。


不,我正在使用Python 3。 - bozeng
我的观点是关于双百分号 %%。正如上面的学术答案所提到的,任何需要使用百分号的字符串都不能包含单个 %。只能使用双百分号 %%。 - John Hua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接