Python错误总结

 

Set是无序集合类型,注意在访问时无序,不要放在有序的应用当中,如机器分类标签记录。

 

continue, break只跳出一层循环

 

shutil.copy出现Permission denied。原因是没有dstPath只定位到文件夹而不是文件。

 

使用IDE开发注意,os.getcwd()是获取工作目录,与打开的方式有关。(如用vscode则是打开的文件夹,用cmd则是当前命令路径)。sys.path[0]是执行文件的文件绝对路径

两张二值图不能直接相减,要用cv2.subtract

 

图片拷贝使用用浅拷贝copy就可以了,深拷贝耗内存

 

判断对象是否为None,不能用==,要用is。

is和==的区别:

is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。

==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等

 

Range函数第一个下界参数是闭区间,第二个上界参数是开区间,注意要+1处理。

 

Import多层级路径要注意是以执行文件为当前路径。

 

流程控制语句还有return语句注意缩进的位置。

 

Set对象没有顺序,列表才有。记录label切记不要用set对象存储。

 

使用slices获取矩阵中的片段时注意如果超出了range范围会返回None。

 

print函数打印时出现OSError: raw write() returned invalid length 136 (should have been between 0 and 82)

总的来说,与win10系统、版本有关系(本人win10,版本 10.0.16299 版本 16299)

解决办法:

import win_unicode_console

win_unicode_console.enable()

 

使用相对路径时,以代码执行的当前文件为起始路径,可以防止发布给别人用时路径错误。

 

__new__和__init__的区别:

调用顺序:先__new__后__init__

__new__是类级别的方法,是个静态方法

__init__是对象级别的方法,用于设置对象属性的一些初始值,所以注意:每个重新获取的对象,都会调用该方法。例如很多加载工作就不要放在这里执行,否则每次获取对象都会重新加载。

 

在for循环里面对循环对象进行更改会容易导致出错,如:

for index, name in enumerate(name_list):

         if name == ‘me’:

                   name_list.remove(index)

 

编码乱码问题,先区分bytes,str和unicode,

Python2有两种表示方式str和unicode,unicode encode成str,str decode成unicode。

 

Python3有两种表示字符串的方式str和bytes,str encode成bytes,bytes decode成str

 

https://i-blog.csdnimg.cn/blog_migrate/26864ba84f87a9abd74546874363bf67.png

Python3 中 bytes其实是字节串, str才是真正意义上的字符串。

Python3以前默认使用ASCII编码方式,Python3以后统一用Unicode编码方式。

Windows系统中默认使用GBK编码,open读写文件默认跟随Windows的默认编码,即GBK,控制台上显示UTF-8字符时不兼容会出现乱码。

 

当try块中发生异常,如果except块中的处理也出异常,except的异常会直接覆盖try中的异常。

Finally中不要使用return或break!!!因为当try块中发生异常,如果在except语句中找不到对应的异常处理,异常会被临时保存起来,当finally执行完毕后,临时保存的异常将会被再次抛出,但如果finally语句中产生了新的异常或者执行了return或break语句,那么临时保存的异常将会被丢失,从而导致异常屏蔽。而如果在try中return会被finally中的return覆盖。

 

任何形式的数值类型0、0L、0.0、0j,空序列和字典 都为空,但None不为空,是NoneType对象。(空和None)!=False但都为会被判为False。

 

Python2使用的__nonzero__在Python3中改为了__bool__。

 

字符串不可以修改赋值。

 

可变类型:列表、字典

不可变类型:数字、字符串、元组

对象的赋值都是进行对象引用(内存地址)传递

list2 = list1,list1改变时list2也会跟着改变,因为他们指向同一个地址。

列表切片操作相当于浅拷贝,如list2 = list1[:],相当于复制了一个新的内存地址。

浅拷贝复制了对象,但对象里面的元素还是用以前的引用。所以当做浅拷贝时,如果里面的可变元素发生了变化,引用是没有变化的,就会出现跟着变化。这时候深拷贝才能解决这个问题。

例如:list1=[1,2,3]用浅拷贝没有问题,里面没有可变元素;

list1=[1,2,[3,4]]要用深拷贝,因为里面的[3,4]是一个可变元素。

 

函数传参既不是传值也不是传引用,而是传对象。

 

++i不等于i+=1。++i其实是+(+i),意味着取两次正号,正正得正,结果没变还是i。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值