技术分享
包括但不限于生物信息学分析软件、流程、分析方法、编程、算法、集群管理和运维等技术分享

Python中列表的 += 和 .extend() 的异同

一道Python题

最近有朋友“考”了我一个Python的题:使用+=.extend()两种方法扩展元组中的列表会发生什么。虽然我对Python中的可变数据类型、不可变数据类型的概念都有较深的理解,并且也对list的++=.extend().append()做过性能分析,但是+=.extend()两者无论在表现(是否为原地址修改)以及性能上都非常近似,所以对两者的区别还没有明确的概念。为了解答这个问题,我我们先直接上代码试验一下:

# 创建一个包含列表的元组:
>>> a_tuple = (1, 2, [])
>>> a_tuple[2] += ['a', 'b']        # (1)
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    a_tuple[2] += ['a', 'b']
TypeError: 'tuple' object does not support item assignment
>>> a_tuple[2].extend(['a', 'b'])   # (2)
>>> a_tuple                         # (3)
(1, 2, ['a', 'b', 'a', 'b'])
  • (1) 通过+=的方法扩展列表出现“元组不支持元素赋值”的报错。
  • (2) 使用.extend()方法。
  • (3) 有趣的是,列表被扩展了两次。虽然+=报错,但是却成功修改了列表。

- 阅读完整内容 -

awk命令坑了多少科研工作者?

著名“错误使用”案例——Excel的单元格格式

之前看过一篇文章,讲述的是2016年发表在《Genome Biology》上的一项研究报道——Microsoft Excel中的单元格格式的自动转换导致研究的期刊中将近20%的论文存在基因名转换错误。比如会把RIKEN identifier “2310009E13”作为科学计数法转换成“2.31E+19”,或者将基因名“SEPT2”作为日期转换成“2018/09/02”。其实早在2004年该问题就已经在《BMC Bioinformatics》上有相关报道,但似乎没引起警觉。不过Excel作为一款在各种领域广泛使用的电子表格软件,微软不太可能为了这类问题而牺牲其“智能”、“易用”的特色。并且这也只能算是用户的“错误使用”,而不是Excel的bug。下面是两篇论文的原文,有兴趣可以一看:

不得不小心的awk之坑,Caveat Emptor!

以上是联想到的题外话,本文主要介绍的是“GNU awk”(即gawk)中的一个坑。和Excel的故事非常类似,都可以归咎为理解不够深入而导致的“错误使用”。而且相比Excel格式转换这种错误,这个问题隐蔽性更高,即使对编程语言的精度问题有所了解,但是还是会掉到坑里,甚至让我一度以为awk出现了bug。

- 阅读完整内容 -