You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3中格式化字符串里{0:s}与{0!s}的区别是什么?

Python中{0:s}和{0!s}的区别

两者在部分场景下输出结果一致,但本质是完全不同的操作:

  • !s 是转换操作:它的作用是强制将对应的值转换为字符串,等价于调用内置函数str()处理该值。不管传入的是整数、浮点数还是自定义对象,经过!s转换后都会先变成字符串形式,再参与后续格式化。
  • :s 是格式说明符:它要求传入的值本身必须是字符串类型(或能适配字符串格式规则的对象),如果传入非字符串类型会直接抛出TypeError。它的作用是对已有的字符串进行格式约束(比如指定宽度、对齐方式等),不承担类型转换的职责。

对比示例

当传入非字符串类型时,两者的差异会立刻显现:

# 使用!s:整数123被转为字符串,正常输出
print("转换后:{0!s}".format(123))  # 输出:转换后:123

# 使用:s:传入整数不符合字符串格式要求,触发报错
print("格式化:{0:s}".format(123))  # 抛出 TypeError: unsupported format string passed to int.__format__

回到你给出的例子print("Hello {0:s} and {0!s}".format('foo')),因为传入的'foo'本身就是字符串,所以!s的转换操作相当于“重复操作”,最终输出和直接用:s的结果一致,但底层逻辑完全不同。

关于你的疑问:!开头的转换字段确实是做类型转换,除了!s对应str(),还有!r对应repr()、!a对应ascii(),它们都是先转换值的类型,再进行格式化;而:开头的格式说明符是在值的类型符合要求的前提下,调整输出的格式样式。

内容的提问来源于stack exchange,提问作者DCR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:04:57