社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

N年Python老司机,血泪总结新手常见10大错误

菜鸟学Python • 5 年前 • 466 次点击  

作为python的新手,大家在上手python的时候都会或多或少的接触到一些rookie mistake,也就是菜鸟级别的错误。小编作为一个老司机也是从这些错误中一点一点的积累经验,才慢慢的能够熟练的使用python。


遇到错误不可怕,关键是要学会如何去避免犯这些错误。今天小编就带领大家看一下作为python新手最常见的几个错误,希望大家能够在学习的过程中,尽量的去避免这些错误。


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不可变类型相违背,因此就无法实现自增或者自减操作了。


以上10条信息是小编个人在N年的漫长python学习生涯中总结出来的新手常见的错误,具有很高的代表性,希望大家能够引以为戒,不要犯同样的错误。


往期趣味Python
30行Python代码来绘制一个微信图标
手把手教你50行Python代码,给心目中的女友微博秒评论
还在做重复的劳动,不如用Python自动生成Excel以邮件发送


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56898
 
466 次点击