1. SyntaxError: unexpected EOF while parsing
解析时出现错误的文件结束符。检查一下错误句子中是否有括号不匹配等问题
2、SyntaxError: invalid syntax
出现无效语法。
比如:表示复数complex用“j”,不要错用为i
3、TypeError: isinstance expected 2 arguments, got 1
isinstance(), 这个方法应该有两个参数,但是只给出了一个。
比如,isinstance (10, int)
4、type和isinstance的区别
class A: pass class B(A): pass print(isinstance(B(), A)) print(type(B()) == A)
输出为:
True False
说明:
- type()不会认为子类是一种父类类型。
- isinstance()会认为子类是一种父类类型。
5、预备知识(参考链接戳这里)
为了更直观的理解变量的存储,我们需要首先了解三个概念:id(身份标识)、变量赋值、以及修改。
(1)id函数:你可以通过python的内置函数 id() 来查看对象的身份(identity),这个所谓的身份其实就是 对象 的内存地址, 就是获取对象在内存中的地址。
(2)变量赋值:参考7,为了避免为整数频繁申请和销毁内存空间,在一定的范围内的int和str型的数值,当赋值给两个变量时,两个变量所存储的地址相同。但是对于其他数据类型(float, tuple,list,dict或set),即使变量所指向的数值完全相同,也不会是同一个内存地址。如下:
list1 = [1,2,"abc", 'e', 't'] list2 = [1,2,"abc", 'e', 't'] print(id(list1), id(list2))
结果为:
1882468179336 1882468342152
但是如果将一个引用(变量)赋值给另一个变量,两个变量将指向同一个地址,只是会给现存的对象添加一个新的引用,并不会在内存中生成新的对象:
list1 = [1,2,3,"abc"] list2 = list1 print(id(list1), id(list2))
结果为:
1882468366664 1882468366664
如果采用分片复制,分片[:]复制是不同的,他会创建一个新的对象,list1和list3的值相同,但是地址是不同的,相当于复制了一份新的,如下(copy()函数和分片相同):
list1 = [1,2,3,"abc"] list3 = list1[:] print(list1,list3) print(id(list1), id(list3))
结果为:
(3)可变数据类型的修改:对于list,dict或set,如果修改其中某一项元素的值,或者添加几个元素,不会改变其本身的地址,只会改变其内部元素的地址引用。
print("------原列表------") list1 = [1,2,3,"abc"] print(list1) print(id(list1)) print(id(list1[1])) print("------删除元素------") del list1[1] print(list1) print(id(list1)) print(id(list1[1])) print("------增添元素------") list1.append(2) print(list1) print(id(list1)) print(id(list1[1])) print("------更改元素------") list1[1] = 1 print(list1) print(id(list1)) print(id(list1[1]))
结果为:
可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址不会改变,只是对应地址的内容改变或者地址发生了扩充,所以对于相同的值的不同对象,会存在多份,即每个对象都有自己的地址。
(4)不可变数据类型:不可变数据类型int, float, str, tuple,不允许变量的值发生变化,如果改变了变量的值(比如使用+=操作),相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,就是不可变数据类型引用的地址的值不可改变。
str1 = "ab" print(id(str1)) str1 += "123" print(id(str1))
结果为:
1882430023360 1882468372584
6、Python中变量在内存的存储与地址变化(参考链接戳这里)
Python变量保存的是值的引用 也可以说:变量是对内存及其地址的抽象。变量所需的存储空间大小一致,因为变量只是保存了一个引用。也被称为对象语义和指针语义。变量的每一次初始化,都开辟了一个新的空间,将新内容的地址赋值给变量。如下图:
6、is和==的区别(参考这里)
总结: 只有 int 型和 str 型的情况下,a is b才为True,当a和b是float, tuple,list,dict或set型时,a is b为False。
另外,需要注意的是,a = b = 10; id(a) is id(b) 的结果是False。虽然id(a) 和 id(b) 的值是相同的,原因如下:
事实上Python 为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。而Python 对小整数的定义是 [-5, 257),只有数字在-5到256之间它们的id才会相等,超过了这个范围就不行了,同样的道理,字符串对象也有一个类似的缓冲池,超过区间范围内自然不会相等了。
7、深拷贝和浅拷贝(链接:https://blog.csdn.net/as480133937/article/details/87305247)