Python 避坑指南:3基础进阶小细节,新手必看

39 阅读2分钟

你是不是写 Python 时总遇到一些 “莫名其妙” 的 bug?明明语法没写错,结果却和预期差十万八千里?这 3 个进阶偏基础的知识点,帮你避开新手期 80% 的坑!

1. 列表浅拷贝:别再踩 “改副本也动原列表” 的坑

新手复制列表总爱用 list2 = list1,以为是创建了新列表,结果改一个两个都变!这是因为赋值只是传了引用,真正的浅拷贝得用这两种方法。

# 反面教材:直接赋值,共享内存
fruits1 = ["apple", "banana", ["orange", "grape"]]
fruits2 = fruits1  # 只是引用,不是复制
fruits2[0] = "pear"
print(fruits1)  # ['pear', 'banana', ['orange', 'grape']] 原列表也变了!

# 正确姿势1:切片浅拷贝
fruits1 = ["apple", "banana", ["orange", "grape"]]
fruits2 = fruits1[:]
fruits2[0] = "pear"
print(fruits1)  # ['apple', 'banana', ['orange', 'grape']] 原列表不变
# 注意:嵌套列表还是共享的
fruits2[2][0] = "mango"
print(fruits1)  # ['apple', 'banana', ['mango', 'grape']] 嵌套元素会变

# 正确姿势2:list.copy() 方法
fruits3 = fruits1.copy()

2. 字符串不可变:别想着 “原地修改字符”

Python 里的字符串是不可变对象,你永远无法直接修改字符串里的某一个字符,强行操作只会报错!想改字符串,就得重新生成新字符串。

# 反面教材:直接修改字符串字符,报错!
s = "hello"
# s[0] = "H"  # TypeError: 'str' object does not support item assignment

# 正确姿势1:切片拼接
s = "hello"
new_s = "H" + s[1:]
print(new_s)  # Hello

# 正确姿势2:用字符串方法替换
s = "hello world"
new_s = s.replace("world", "python")
print(new_s)  # hello python

3. is vs ==:别再傻傻分不清

新手判断两个值是否相等,总爱用 is,但 is 比的是内存地址== 比的才是!只有小整数池(-5~256)里的数字,才会出现 is 和 == 结果一致的情况。

a = 100
b = 100
print(a == b)  # True 值相等
print(a is b)  # True 小整数池,内存地址相同

a = 257
b = 257
print(a == b)  # True 值相等
print(a is b)  # False 超出小整数池,内存地址不同

# 字符串同理
s1 = "python"
s2 = "python"
print(s1 is s2)  # True 字符串驻留机制
s3 = "py" + "thon"
print(s1 is s3)  # True 编译时优化

# 列表不一样
list1 = [1,2,3]
list2 = [1,2,3]
print(list1 == list2)  # True
print(list1 is list2)  # False 列表是可变对象,不共享内存

小总结

  1. 列表复制别直接赋值,用 [:] 或 copy() 做浅拷贝;
  2. 字符串不可变,修改要靠拼接或内置方法;
  3. 判断值相等用 ==,判断是否是同一个对象用 is