在Python中,字符串字面量可以通过前缀修饰以改变其处理方式或语义。除了常见的f"hello"(格式化字符串)和r"hello"(原始字符串),还有以下几种核心用法:
1. b"hello":字节字符串(Bytes Literal)
- 表示一个字节序列(类型为
bytes),而非Unicode字符串。 - 示例:
data = b"hello" # 类型为bytes,存储的是二进制数据 print(type(data)) # <class 'bytes'> - 常用于处理二进制数据(如文件、网络传输)。
2. u"hello":Unicode字符串(历史遗留,Python 3中已默认)
- 在Python 2中用于显式声明Unicode字符串(与普通字符串
str区分),但在Python 3中所有字符串默认均为Unicode,因此u前缀不再有实际效果,仅保留兼容性。 - 示例:
s = u"hello" # Python 3中等价于"hello" print(type(s)) # <class 'str'>
3. 三引号字符串("""或'''):多行字符串
- 使用三引号(单引号或双引号)可定义跨多行的字符串,自动包含换行符和缩进。
- 示例:
multi_line = """ Line 1 Line 2Indented Line """ print(multi_line) # 输出: # Line 1 # Line 2 # Indented Line
4. 组合前缀:fr"hello"、rb"hello"等
- 多个前缀可以组合使用(顺序通常为
r/f在前,b在后),例如:fr"name: {name}":原始格式化字符串(先处理原始字符串的转义,再格式化)。rb"data":原始字节字符串(字节序列中的\n等不会被转义)。
- 示例:
name = "John" s = fr"Path: C:\Users\{name}" # 原始字符串 + 格式化,\U不会被转义为Unicode转义 print(s) # 输出:Path: C:\Users\John
5. 隐式转义处理:普通字符串的默认行为
- 无前缀的普通字符串(如
"hello")会正常处理转义字符(如\n换行、\t制表符)。 - 示例:
s = "Hello\nWorld" # 包含换行符 print(s) # 输出: # Hello # World
关键区别总结
| 前缀 | 类型 | 特点 |
|---|---|---|
f |
str |
格式化字符串,支持{}内嵌入变量或表达式(如f"{name} is {age}")。 |
r |
str |
原始字符串,反斜杠\视为普通字符(如r"\n"是两个字符)。 |
b |
bytes |
字节字符串,存储二进制数据(如b"hello")。 |
u |
str |
Python 3中无实际效果(兼容Python 2的Unicode标识)。 |
"""/''' |
str |
多行字符串,保留换行和缩进。 |
注意事项
- 组合前缀顺序:
fr和rf是合法的,但rf在逻辑上等价于fr(先处理原始字符串,再格式化)。 - 字节字符串的转义:在
b字符串中,\n等转义字符仍会被转义,但\xHH(十六进制)是有效的(如b"\x48"表示H)。 - 原始字符串的限制:原始字符串不能以单个反斜杠结尾(如
r"\"会报错),因为Python无法确定是否需要转义。
通过这些前缀,Python提供了灵活处理不同场景下字符串需求的能力,从格式化输出到二进制数据处理,覆盖了广泛的使用场景。