Python 知识点:
-
可变默认参数的陷阱
def append_to(element, target=[]):
target.append(element)
return target
print(append_to(1)) # [1]
print(append_to(2)) # [1, 2] → 惊不惊喜?
解释:默认参数在函数定义时初始化一次,后续调用会共享同一个列表。应改为 target=None 并在函数内初始化。 -
列表推导式的变量泄漏
x = 10
squares = [x**2 for x in range(5)]
print(x) # Python 2 → 4;Python 3 → 10(Python 3修复了泄漏)
解释:Python 2中列表推导式会覆盖外部作用域的变量,Python 3中则不会。 -
闭包与延迟绑定
functions = []
for i in range(3):
functions.append(lambda: i)
print([f() for f in functions]) # [2, 2, 2] → 所有lambda共享最终的i值
解决:通过默认参数立即绑定变量:
functions = [lambda i=i: i for i in range(3)]