python基础学习(2)

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))

结果为:

[1, 2, 3, 'abc'] [1, 2, 3, 'abc']
1882468364424 1882466909192

(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]))

结果为:

------原列表------
[1, 2, 3, 'abc']
1882466888904
140725570941808
------删除元素------
[1, 3, 'abc']
1882466888904
140725570941840
------增添元素------
[1, 3, 'abc', 2]
1882466888904
140725570941840
------更改元素------
[1, 1, 'abc', 2]
1882466888904
140725570941776

可变数据类型,允许变量的值发生变化,即如果对变量进行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

原文地址:https://www.cnblogs.com/liliwang/p/12674040.html