
大家好,欢迎来到 Crossin 的编程教室。
字符串是Python中最常用的数据类型之一,看起来简单,用着顺手,但里面也藏着一些“坑”,很多新手(甚至有些老手)都会在这里不小心踩中。
今天我们就来盘点一下Python字符串的10个经典易错点,帮助你避开这些常见错误。相信看完这篇文章,你对字符串的理解又能更进一步。
1. 字符串是不可变的
Python的字符串是不可变(immutable)的,这意味着一旦创建,就不能修改其中的字符。
很多人写出这样的代码,以为自己改了字符串:
s = "hello"
s[0] = "H" # 试图修改第一个字符结果直接报错:'str' object does not support item assignment
还有人用replace,以为它能原地替换:
s = "hello"
s.replace("h", "H")
print(s) # 还是 "hello"但其实 replace 是返回一个新字符串,原字符串没变。正确写法:
s = s.replace("h", "H")
print(s) # "Hello"记住:任何“修改”字符串的操作,都会返回新字符串,原字符串不变。
2. is 和 == 在字符串里的区别
== 判断值是否相等,is 判断是否是同一个对象。
对于小字符串,Python会做字符串驻留(interning),所以有时is也返回True:
a = "hello"
b = "hello"
print(a == b) # True
print(a is b) # 通常True(因为驻留)但不要依赖 is,尤其是长字符串或动态生成的:
a = "hello world!"
b = "hello " + "world!"
print(a is b) # 可能False所以,永远用 == 比较值相等。
3. 空字符串、None、False 的混淆
空字符串 ""、None、False 在布尔上下文中都为 False:
if "":
print("不会执行")
if None:
print("也不会执行")
if False:
print("还是不执行")但它们是完全不同的东西:
检查字符串是否为空串用 if s == "",不要和 None 混用。
4. strip() 不是“删除字符”
有人以为:
s.strip("abc")是删除字符串里的 "abc" 子串。
但其实它的含义是:
删除字符串两端所有属于字符集合 {a, b, c} 的字符。
print("abc123abc456bca".strip("abc"))
# 结果是 "123abc456"不是替换,不是删除子串,而是从两端往中间“剥字符”,直到不属于集合的字符为止。
5. split() 的默认行为
不传参数的split()很聪明:
s = "a b c d"
print(s.split()) # ['a', 'b', 'c', 'd'] 自动把连续空白当一个分隔符
print(s.split(" ")) # ['a', '', 'b', '', '', 'c', '', 'd']它会自动丢弃首尾空白,并忽略空字段。
6. 字符串比较的“反直觉”顺序
字符串比较是按Unicode码点逐字符比较的:
print("10" < "2") # True 因为'1'的码点 < '2'
print("Apple" < "apple") # True 因为大写A < 小写a因此排序或比较版本号、数字字符串时可能会跟你想象的结果不一样。需要排序数字时,先转 int 或用 key 参数。
7. 字符长度 ≠ 显示长度
len() 计算的是字符数(Unicode码点数),不是视觉宽度:
s = "你好🏃🏻♀️" # emoji组合字符
print(len(s)) # 78. 循环中用 + 拼接字符串的性能陷阱
在循环里这样拼接:
s = ""
for i in range(100000):
s += "a" # 每次都创建新字符串大数据量时会超级慢(O(n²))。
正确方式:
parts = []
for i in range(100000):
parts.append("a")
s = "".join(parts)
# 或直接 s = "".join("a" for i in range(10000))大量字符串拼接时务必用 join。
9. “中文乱码”
中文乱码通常发生在编码/解码不匹配的时候:
text = "中文"
bytes_data = text.encode("gbk") # 用gbk编码
print(bytes_data.decode("gbk")) # 用gbk解码正确
print(bytes_data.decode("utf-8", errors='replace')) # 用utf-8解码 → 乱码 ����读文件、网络数据时,指定正确的编码,否则编码不匹配就会乱码。
10. 结尾不能是单个反斜杠
字符串末尾不能直接写单个 \,因为它会转义后面的引号,即使是前面加上 r 的原始字符串(raw string)也不行:
r"C:\new\test\" # 语法错误如果你想表示 Windows 的路径,直接用 / 替代 \ 吧。
以上就是Python字符串的10个易错点。希望这些例子能帮你少走弯路。
你还踩过什么坑?可以在留言区说一说。
如果本文对你有帮助,欢迎点赞、评论、转发。你们的支持是我更新的动力~
感谢转发和点赞的各位~
本文分享自 Crossin的编程教室 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!