Python开发中的十大“天坑”,快来看看你是否已经掉坑里?

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python开发中的⼗⼤“天坑”,快来看看你是否已经掉坑⾥?
对于Python这门编程语⾔,想必⼤家都很熟悉。

Python相较于其他语⾔,⾮常的简单易上⼿,⽽且很快就能写出很多的程序。

但是Python 虽然简单,但是⽼司机们还是会在编程的路上“翻车”。

今天,博主就带领⼤家来看⼀下,⼗个Python⽼⼿们最容易掉进去的“坑”。

1.is 和 ==的区别
对于is和==的区别,是⼤家最容易忽视,也最容易犯错的地⽅之⼀。

如何避免这个错误呢?⼤家只需要牢牢的记在⼼⾥⼀句话“is⽐较的是id是不是⼀样,==⽐较的是值是不是⼀样”。

id指的是对象的地址,⽽值就是指对象的数值。

这句话就很⽅便的让⼤家在使⽤is和==上做出区别,从上图的结果中可以看出,a、b、c、的值都是1,但是a和b的id是⼀样的,⽽a和c的id是不同的,所以a is b 返回的是True,⽽a is c返回的是False。

2.Python参数传递是值传递还是引⽤传递
上图可以看出,对于不可变的参数类型,例如字符串、整数这样的类型,函数通过拷贝进⾏传递,因为函数内外的string变量的id是不⼀样的。

⽽对于像是列表,字典这样的可变对象,函数是通过引⽤进⾏传递。

表现在函数内外,列表的id是⼀样的。

3.函数的返回值
当在 "try...finally" 语句的 try 中执⾏ return, break 或 continue 后, finally 依然会执⾏。

⽽在Python的函数中,函数的返回值由最后执⾏的return 语句决定。

所以函数中使⽤ "try...finally" 最后的返回结果⼀定是finally执⾏的结果。

如果⼤家不想要纸样的话,可以去除finally,但是这样的话,程序的鲁棒性可能会存在问题。

俗话说得好实践出真知,这⾥给⼤家推荐⼀套,现在这套是实战案例是的,点击即可。

4.变量值的修改
我们先来看⼀段程序:
上图程序中,我们创建了⼀个⼆维矩阵matrix,只是想去修改matrix【0】【0】元素,但是结果却是第⼀⾏全部被修改了。

这是什么原因呢,如下图所⽰:
当我们利⽤乘法的形式来创建matrix时,matrix[0]、matrix[1]和matrix[2]都指向了sublist的地址。

所以当我们修改matrix[0]时,matrix[1]和matrix[2]的值也对应着改变。

我们可以通过下述的程序进⾏修改。

5.深拷贝,浅拷贝
对于深拷贝和浅拷贝的考察,是Python⾯试题中经常会被问到的问题,⽽且在⽇常的⼯作中,也会经常掉进这个坑⾥。

对于浅拷贝就是对于⼀个对象引⽤的拷贝,⽽深拷贝就是对对象资源的拷贝。

此外,对于不可变对象(字符串、元组,整型)的修改,需要开辟新的空间,⽽对于可变对象(列表,字典等)的修改,不需要开辟新的空间。

上图左侧我们可以看出,浅拷贝后的orilist和copylist中的元素都指向了相同的地址。

我们修改不可变对象的时候,就需要开辟新的空间,所以orilist和copylist中的字符串内容不⼀样。

但是对于list,修改orilist中的list对象后,copylist中的list内容也随之发⽣了改变。

对于深拷贝,上图右侧结果可以看出,⽆论是对于可变对象还是不可变对象,对于orilist的修改都不会影响到deepcopylist中的内容。

6. staticmethod 和classmethod
对于Python的⾯向对象编程时,⼤家经常会见到被staticmethod 和classmethod装饰的函数。

对于classmethod,被成为类⽅法,第⼀个参数必须是cls,表⽰这个类的本⾝,类⽅法在调⽤时,推荐使⽤类名直接调⽤,⽽不是先创建⼀个类对象后调⽤。

⽽对于staticmethod,静态⽅法,其实就是我们学过的普通函数,静态⽅法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对静态⽅法中包含的参数做任何类或对象的绑定,所以类的静态⽅法中⽆法调⽤任何类属性和类⽅法。

对于类的静态⽅法,可以直接使⽤类名调⽤或者创建类对象来进⾏调⽤。

7.全局变量的引⽤
对于在函数中调⽤全局变量,Python中需要使⽤关键字 global。

但是需要注意的是,在主函数中,不需要利⽤global关键字。

8.循环变量泄露
上图我们可以看到当我们在全局变量和局部变量中都使⽤相同的变量名字x的时候,当局部循环结束后,再使⽤全局变量的x时,数值变成了6⽽不是4,这是因为在Python中, for 循环作⽤域在结束后会保留定义的循环变量。

如果我们曾在全局命名空间中定义过循环变量. 在这种情况下, 它会重新绑定现有变量。

所以为了避免这种问题,要谨慎的在全局变量和局部变量中使⽤相同的变量名。

9.del remove pop的区别
对于列表中数据的删除,⼤家可能都对del、remove 和pop有印象,但是它们之间的区别是什么呢?
pop 接受的是元素的下标,在原列表中删除这个元素,并返回删除的元素。

⽽remove是接受元素的值,在原列表中删除这个元素,但是不返回这个值。

⽽del是个语句,可以直接销毁掉mylist[0]这个元素,同时del mylist可以销毁整个mylist的列表。

同时del的删除操作要⽐pop和remove要快。

10.操作符的优先级
对于操作符的优先级需要我们有很好的把握。

如下图所⽰:
我们想判断⼀下,a、b和c中是否⼀个⾄少为3。

但是如果按照最上⾯的程序来写,程序便会报错,原因是“==”的优先级⼤于“or"。

所以判断条件就变为了if (a) or (b) or(c==3)。

这样的话,就与我们开始的设想不⼀样了。

所以我们需要将程序按照下⾯的条件来写,分别将a、b和c与3进⾏判断。

得到正确的判断结果。

总结
以上就是博主今天带领⼤家复习的⼗个Python常见的“坑”,并对其进⾏了⼀⼀的分析和解释。

欢迎⼤家在留⾔区点评,曾经你跨过⼭河⼤海,⼜遇到过⼏个坑?
另外我建⽴了⼀个,。

在彼此的沟通可以我们可以得到很多学习经验,积累知识,群内有很多有意思的脚本和库,还有2020最新的python学习资料分享,⼤家可以⼀起讨论问题,共同进步。

相关文档
最新文档