[转]N年Python老司机,血泪总结新手常见10大错误
1.默认可变对象
上图中,我们定义了addElement函数,在函数的形参中,我们默认使用了可变对象list。当我们连续的使用默认参数调用addElement函数时,可以发现list1只被创建了一次。由于list属于python中的可变对象,因此只在函数被定义的时候才能被创建一次,所以在调用的时候都使用的创建好的同一个list列表。而对于不可变对象,情况就不同了,如下图所示。
对于不可变对象,程序在调用函数时,将不可变对象作为默认参数进行调用。那么我们如何解决这个问题呢,我们可以利用不可变对象进行判断解决,程序如下图所示。
我们利用条件判断,list1是否为None,来决定是否创建新的列表,以此来解决上述的问题。
2.浅拷贝和深度拷贝问题
上述程序中,我们创建了字典dict1。并通过浅拷贝将dict1拷贝给dict2,通过copy库中的deepcopy(深拷贝)将dict1拷贝给dict2。可当删除dict2中的键值为’2’中的子对象的元素后,dict1中的对应元素也被删除了,而dict3却还保留。这就是浅拷贝和深拷贝的区别。如下图所示。
浅拷贝只是拷贝了父对象,但是对于子对象还是引用的同一个对象。而对于深拷贝,则是完全将子对象和父对象拷贝了一份出来,各自都有独立的子对象。
3.切记不要用官方库文件名来命名自己的文件
这里的官方库指的是大家需要import的库,这里小编统称为官方库。如下图所示。
小编创建了一个py文件,并命名为numpy。当小编想要调用大名鼎鼎的“numpy”时,此时程序报了找不到属性的“array”的错误。原因就是小编将自己的py文件命名为了numpy,程序便会自动的在当前文件里面找“array”这个属性。结果可想而知,当然找不到啦,所以小编提醒大家,千万不要将自己文件的名称与官方库撞名,不然会出大问题。
4.学会迭代器的使用
Python作为一个非常方便快捷的语言,很多元素都具有可迭代性,我们要充分利用好这些性质,如下图所示。
我们想要对list对象中的所有元素执行addOne函数,传统的也是标准的方法是利用for循环来实现,就如第一种方法。但是由于list对象是可迭代对象,我们完全可以利用好这个优势,一行代码就搞定这个问题,如第二种方法所示。所以充分利用好python中一些可迭代对象的性质,会节省很多的代码,同时也让我们少犯错误。
5.频繁的使用全局变量
作为python的初学者,大家都喜欢定义全局变量,并在函数中改变全局变量,不可否认的是某些地方需要在函数中改变全局变量,但是这样的方法会对程序带来伤害,程序的安全性会变得脆弱。大家需要在平时的编程中改变这种习惯,如下图所示。
在编程时,我们应该尽量使用传参的形式来使用全局变量,而不是直接修改全局变量。因为全局变量大多数情况下是所有的函数共享的变量,为了保证程序的安全,不应该随便被改变,除非在程序设计的时候,要求去改变全局变量。
6.明确是python2还是python3
在初学python的时候,大家可能会被python2还是python3搞得手足无措,无法及时的在python2和python3的语法中进行切换,大家需要明确自己使用的python版本,因为python2与python3区别还是比较多的,因此大家需要格外小心,如下图所示。
由于python2和python3中的输出表达形式不同,所以大家需要在使用print函数时,在python3版本后面加小括号进行输出。
7.分不清”is”和“==”的区别
对于“is”和“==”的使用 ,大家平时多用来判断两个值是否相等,但是这“相等”在python中也有不同的概念,我们要区分是地址相等还是数值相等,如下图所示。
上述程序中我们分别利用is和==俩判断两个列表是否相等,可以看出,is是判断两个列表的地址是否相等,而==是看两个列表中的数值是否一致。大家可以记住一个顺口溜:is看地址,等号看内容,这样再使用is和==进行元素判断时就不会再犯错误了。
8.将python的关键字作为变量名称
作为python的初学者,往往会搞不清楚python的关键字有哪些,从而会使得程序报错。
上述的程序中,我们利用关键字“class”来创建新的类别,这会导致程序报错,同时我们可以发现,编辑器对于关键字的提示是不同的颜色提示,告诉我们使用的是关键字,从而让我们注意不要使用关键字作为变量名称。
9.使用未定义的局部变量
对于局部变量,我们在调用它的时候需要确保它被定义,如下图所示。
对于printLocalNum1,我们没有定义localnum就调用它 ,结果必然报错,但是在printLocalNum2中,我们通过判断输入的大小,给localnum进行赋值,然后输出localnum的结果,这里,我们通过if else做了万全的判断,确保无论在何种数值(注意必须是数值)输入下,localnum都会被进行赋值,从而不会调用未定义的localnum。
10.规避++操作和—操作
Python虽然语法简单,但是对于C++、java中的++或者—的自增和自减操作是不支持的,原因是为什么呢?小编给大家一个我个人的理解,由于在python中整数是不可变类型,创建之后就不能被改变,而自增和自减就是将原先地址里的数值进行改变替换,这与python不可变类型相违背,因此就无法实现自增或者自减操作了。