Python的设计哲学看似简单,但这5个地方,连老手都要想半天才反应过来
1、字符串驻留:同一个字符串,两个变量是同一个对象
s1 = "hello"s2 = "hello"s3 = "hel" + "lo"print(s1 is s2) # ✅ True(字符串驻留)print(s1 is s3) # ✅ True(编译时常量合并)# 但加空格就不一定了s4 = "hel lo"s5 = "hel lo"print(s1 is s4) # ❌ False
2、迭代器只能遍历一次
# 通常迭代器执行一次后就没有数据了it = iter([1, 2, 3])print(list(it)) # → [1, 2, 3]print(list(it)) # → [](空了!)it = iter([1, 2, 3])for x in it: print(x)# 用 cycle 可以循环迭代from itertools import cyclec = cycle([1, 2, 3])print(next(c), next(c), next(c), next(c)) # → 1 2 3 1 2 3...
迭代器是消耗性的,遍历完就空了,不会自动重置。range() 不会这个问题,但 iter() 转换后的会。
3、列表的 + 和 += 不等价
a = [1, 2]b = aa = a + [3, 4] # 创建新列表,a指向新对象,b不变print(a, b) # → [1,2,3,4] [1,2]a = [1, 2]b = aa += [3, 4] # 原地修改,a和b都变print(a, b) # → [1,2,3,4] [1,2,3,4]
原因:+= 调用的是 extend(),+ 调用的是 __add__(返回新列表)。
a += [3,4] 是原地扩展,a = a + [3,4] 是创建新列表再赋值,完全不同!
4、True + 1 = 2
print(True == 1) # ✅ Trueprint(True + 1) # ✅ 2(True = 1,False = 0)print(True + True) # ✅ 2# 实战影响result = sum([True, False, True, True])print(result) # → 3(自动转为1+0+1+1)# 陷阱flags = [True] * 5print(sum(flags)) # → 5print(all(flags)) # ✅ True
bool 是 int 的子类,True=1,False=0。这是个特性,不是bug,用好了很优雅。
5、赋值语句有返回值
# Python的赋值表达式(海象运算符 :=)x = 10print(x := 20) # → 20(赋值并返回)# 普通 = 也有返回值if x = 10: # ❌ SyntaxError pass# 但函数返回值可以是 =y = (x := 10) + 5 # y = 15, x = 10print(y) # → 15
:= 是赋值表达式(3.8+),但普通 = 不是表达式,是语句,没有返回值。
-------------------------它是数字世界里的一把杀猪刀
却总能巧夺天工
它的世界是纯粹0、1组合
却总能创造无尽幻想
......
本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。