你是不是写 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 列表是可变对象,不共享内存
小总结
- 列表复制别直接赋值,用
[:]或copy()做浅拷贝; - 字符串不可变,修改要靠拼接或内置方法;
- 判断值相等用
==,判断是否是同一个对象用is。