我刚工作那会接手了一个老项目,打开代码一看,print后面没有括号,input函数还能当数字用。当时就懵了,这到底是Python2还是Python3?查了半天资料,头都大了。后来踩了无数坑,才总结出这几个关键差异。
第一个差异就是print从语句变成了函数。Python2里直接写print “hello”就行,Python3非要写成print(“hello”)。这看起来小事,但老项目里如果有一百个print,你得挨个加括号。我有个同事没注意这个,迁移完程序直接报语法错误,排查了一下午。
第二个差异是整数的除法行为变了。Python2里5/2等于2,因为整数除法直接取整。Python3里5/2等于2.5,想取整得用5//2。有个做数据统计的同学,迁移完计算平均值,发现所有结果都变成整数了,数据全错。他找了一天才发现问题出在除法上。
第三个差异是字符串编码方式改了。Python2默认用ASCII编码,中文经常报错。Python3默认用Unicode,中文处理友好很多。但迁移时要注意,老项目里那些decode、encode方法可能都得调整。有个写爬虫的朋友,迁移后网页上的中文全变成乱码了,搞了两天才搞定编码问题。
第四个差异是input函数的返回值不同。Python2的input会把用户输入当作代码执行,比如输入1+1会返回2。Python3的input把输入全当字符串,输入1+1返回的是“1+1”这个字符串。这区别很要命,老项目里如果直接用input做数学运算,Python3下会直接报错。
第五个差异是range和xrange的关系。Python2里range返回列表,xrange返回生成器。Python3里range直接返回生成器,没有xrange了。迁移时如果老代码用了xrange,直接改成range就行。但要注意,如果代码里对range返回的列表做了切片或修改,Python3里就不能这么干了。
这些差异看着不起眼,真动手迁移的时候一个比一个坑。我建议迁移前先在项目里搜一下print、除法符号、input、xrange这些关键词,重点检查。找个简单的模块先试试水,别一上来就全量迁移。慢慢来,比回头填坑要快得多。