为什么Python列表的sort函数在两种调用场景下输出结果不同?
差异根源:列表sort的原地排序设计逻辑
Python 列表自带的sort()方法从设计上就是原地修改的无返回值方法:
- 它的运行逻辑是直接在内存中调整原有列表的元素顺序,不会新生成一个排好序的列表对象作为返回值,方法执行完成后固定返回
None - 第一种写法里,
print(l.sort(reverse = True))直接打印sort()方法的返回值,自然输出None;实际上此时sort操作已经对原列表完成了排序,只是代码没有打印修改后的原列表,而是拿了方法本身的返回值来输出 - 第二种写法里,先单独执行
l.sort(reverse = True)完成列表的原地修改,忽略方法本身的返回值,之后再把修改完成的原列表对象传给print,因此能看到逆序排列后的正确结果
易混淆点说明
list.sort()和内置的sorted()函数设计逻辑有本质区别,很容易被搞错:
list.sort():原地修改原列表,没有可使用的返回值,运行时不需要额外申请新列表的内存空间,空间效率更高sorted():接收任意可迭代对象作为输入,生成全新的排序列表作为返回值,不会改动原对象的内容,适合需要链式调用、或者原列表不能被改动的场景
直观的代码对比:
l = [1, 2, 3] # sort 写法 print(l.sort(reverse=True)) # 输出None print(l) # 原列表此时已被修改为[3,2,1] # sorted 写法 print(sorted(l, reverse=True)) # 输出[3,2,1],原列表的内容完全不会发生改动
内容的提问来源于stack exchange,提问作者spartan
相关产品推荐
相关产品推荐

