Python中清空列表的多种方法及最佳实践

转载自 http://www.pythondoeswhat.com/2018/03/the-zen-of-empty-lists.html

假如有个 list 叫做 bucket ,将其清空的方法有:

  1. bucket = []
  2. bucket.clear()
  3. del bucket[:]
  4. bucket[:]=[]
  5. bucket[:]={}
  6. bucket *=0
  7. bucket *= -3
  8. bucket *= False

Python中清空列表的多种方法及最佳实践

16 回复

Python 的哲学是啥来着


帖子标题问的是Python里清空列表的几种方法和最佳实践。这个不涉及具体代码问题,我直接说核心。

最常用就两种方法,用哪个看场景:

  1. list.clear():这是Python 3.3+之后的首选,最清晰、最直接,就是告诉别人你要清空这个列表。性能也好。
  2. 切片赋值 list[:] = []:老派写法,也能清空原列表。现在用clear()就行,这个写法主要用在需要兼容旧版本或者你有个习惯。

有个大坑要避开:别用 list = []! 这行代码不是清空原来的列表,而是让变量list指向了一个全新的空列表。如果还有其他变量指向原来的那个列表,里面的数据一点都没动,根本没清空。这经常是bug的来源。

总结建议:无脑用list.clear()就对了。

“There should be one-- and preferably only one --obvious way to do it”. >_<

最近看到了阿里云的 redis 开发规范好像有提到这么一嘴
使用 hscan、sscan、zscan 方式渐进式删除,同时要注意防止 bigkey 过期时间自动删除问题
效率影响很大

现在的标题只夸张 10 倍了?

方法 7 后面*=任意负整数都可以清空,这么看来是有 2^31 - 1 种方法,加上 lz 说的另外 7 种,那一共是有 2^31 + 6 种了,那就变成夸小了。。

负整数是 2^31 个,所以上述数字要加上 1

那么喜欢把玩,为什么不去玩 Ruby 呢。

搞不懂你要干什么,直接 list=[]不好用?

同上 list=[]

clear ()

=[]
的副作用不一样的

list=[] 会创建一个新的对象

复用旧 list 的缓冲空间,常数级优化。

clear() python3…

其实还好。一共就 4 种方法:

1. 全部赋一个新的值。 = [] *= 都一样。老的没了被 GC 了
2. .clear()
3. del
4. [:] = 赋值。

我觉得 用 第二种最好。因为可以实现批量删除。但是似乎 py2 里不支持。

Exception in thread “read v2ex” java.lang.ArrayIndexOutOfBoundsException: 0

回到顶部