惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog
IT之家
IT之家
博客园 - 聂微东
The Cloudflare Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
H
Help Net Security
博客园 - 叶小钗
V
V2EX
WordPress大学
WordPress大学
J
Java Code Geeks
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页
C
Check Point Blog
B
Blog
D
DataBreaches.Net
美团技术团队
罗磊的独立博客

晚花行乐

马克卡尼在2026年达沃斯论坛上的讲话(阅读材料) | 晚花行乐 鸡娃如何用力才是恰到好处 | 晚花行乐 读万卷书,行万里路的辩证关系 | 晚花行乐 反对培训机构掐尖招生 | 晚花行乐 小泽和建国会谈最后10分钟全文(阅读材料) | 晚花行乐 来看看 DeepSeek 怎么鸡娃 | 晚花行乐 谈谈基本功 | 晚花行乐 惠普 ProDesk SFF PC 各系列参数对比 | 晚花行乐 解决瘦客户机上安装 Debian 12 启动失败问题 | 晚花行乐 意拾喻言:老外写的文言文 | 晚花行乐 笠翁对韵中的典故(十三元) | 晚花行乐 谈谈中考取消四小门 | 晚花行乐 亚马逊云科技产品免费试用攻略(3) - 对象存储服务 | 晚花行乐 在 Windows 10 LTSC 版本上安装 WSL2 | 晚花行乐 Debian 12 的常用配置项 | 晚花行乐 在 Debian 12 上安装 Nvidia 显卡驱动程序 | 晚花行乐 解决 Debian 12 关机失败问题 | 晚花行乐 解决 VS Code 自动更新版本后卡在连接界面 | 晚花行乐 观看巴黎奥运会有感 | 晚花行乐 在 Windows10 上安装惠普旧打印机驱动程序 | 晚花行乐 欢迎关注公众号:晚花行乐 | 晚花行乐 如何编写拼写检查器 | 晚花行乐 亚马逊云科技产品免费试用攻略(2) - 云服务器 | 晚花行乐 Pandas 中 axis 参数的理解(附实例) | 晚花行乐 我打算命个名,叫什么什么 Manager | 晚花行乐 上海武康路历史建筑一览 | 晚花行乐 Python 实现简单的数学表达式解析并处理 | 晚花行乐 观看马拉松的感悟 | 晚花行乐 Python 保存 Cookies 到文件并再次读取 | 晚花行乐 如何为 Hugo 静态网站添加评论功能 | 晚花行乐
Python的陷阱 | 晚花行乐
2014-11-21 · via 晚花行乐

写python程序时有些陷阱需要注意,不然就会对bug视而不见,或者得不到想要的结果。

list的append无返回值

list列表的append函数只做原位(in place)操作,改变原有的列表的内容,而不是返回一个新的列表。

>>> a = [1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b = a.append(5)
>>> print b
None
>>> print a
[1, 2, 3, 4, 5]
>>>

list的sort无返回值

与append函数类似,sort也只做原位(in place)操作,在原有的列表内排序,而不返回一个新的列表。

shelve对象

>>> import shelve
>>> s = shelve.open('test.dat')
>>> s['x'] = ['a', 'b', 'c']
>>> s['x'].append('d')
>>> s['x']
['a', 'b', 'c']

上面的例子里,shelve的open函数返回的对象虽然看起来和普通的列表一样,但是在调用sync()之前,它的值不会发生改变,所以,当s[‘x’]再次被读取时,仍然是原始的值,’d’字符没有保存进shelve

新建默认值为空的字典

这个话题在 这篇文章 中单独介绍

在列表中循环的同时,删除列表元素

假设我们需要从一个列表中去除部分元素,比如从下面的列表:

[0,1,2,3,4,5,6,7,8,9]  # list(range(10))

中,删除所有大于5的元素。我们试着这么写:

a = list(range(10))

for x in a:
    if x > 5:
      a.remove(x)

print(a)  # [0, 1, 2, 3, 4, 5, 7, 9]

没有得到想要的,我们换种实现方法:

a = list(range(10))

for i, x in enumerate(a):
    if x > 5:
      del a[i]

print(a)  # [0, 1, 2, 3, 4, 5, 7, 9]

使用 remove() 或者 del 得不到期望的结果的原因是:当找到第一个大于 5 的元素 6 时,索引 i=6,这时候删除元素6,后面的元素向前移动,7到了原来6的位置,索引 i=6 指向了7,索引 i=7指向了8。 于是下一个循环中,将判断 索引 i=7 的值是否大于5,由于7向前移了一位,“逃过了” 检查,所以就保留在了原数组中。

那么有没有办法解决这个问题?有两个办法

  1. 列表解析的方法是可行的:
a = list(range(10))

print([x for x in a if x < 5])  # [0, 1, 2, 3, 4]
  1. 将原数组复制一个备份出来,只要在后面加上 [:] 即可
a = list(range(10))

for x in a[:]:
    if x > 5:
      a.remove(x)

print(a)  # [0, 1, 2, 3, 4, 5]

各位读后有什么想法,请在下方留言吧!如果对本文有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

精彩评论