一. 'is' '=='
总结
·is是比较两个引用是否指向了同一个对象(地址引用比较)。
·==是比较两个对象是否相等。(比较的数值)
二. 浅拷贝'
浅拷贝:
拷贝的是地址引用。可以找到共同的内容一方修改了,另一方受影响
a = [1,2,3,4]
b = a
print(id(a))
print(id(b))
a.append(5)
print(a)
print(b)
三 深拷贝'
深拷贝:
深拷贝的是内容一样。地址不一样。一方修改了,另一方不受影响
b = copy.deepcopy(a),b得到的内容与a的内容完全一样,地址不一样。
就算a中有对象引用,b中对应的引用的对象依然是内容一样,地址不一样。
递归拷贝
注意:
如果是一个不可变对象(内部存储还是不可变对象),深拷贝的结果 = 浅拷贝,地址一样
import copy
a = [1,2,3,4]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(a)
print(b)
a.append(5)
print(a)
print(b)
print('*'*50)
a = (1,2,3,4)
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(a)
print(b)
print('*'*50)
#a = (1,2,3,4,[1,2])
a = (1,2,3,4,(1,2))
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(a)
print(b)
print('*'*50)
a = [11,22,33]
b = [44,55,66]
c = [a,b]
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(c)
print(d)
a.append(120)
print(c)
print(d)
print('*'*50)
a = [11,22,33]
b = [44,55,66]
c = (a,b)
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(c)
print(d)
a.append(120)
#c[0].append(120)
print(c)
print(d)
四. copy.copy()
b = copy.copy(a)
copy.copy这个函数结果会因为是可变或者不可变导致结果不同
只能拷贝一层。根据类型有关。如果是列表(可变类型),深拷贝。如果是元组(不可变)浅拷贝
如果里面还有嵌套的对象,浅拷贝
import copy
'''
a = [1,2,3,4]
#相当于深拷贝
b = copy.copy(a)
print(id(a))
print(id(b))
a.append(5)
print(a)
print(b)
print('*'*50)
a = (1,2,3,4)
#相当于浅拷贝
b = copy.copy(a)
print(id(a))
print(id(b))
'''
a = [11,22,33]
b = [44,55,66]
c = [a,b]
d = copy.copy(c)
print(id(c))
print(id(d))
print(c)
print(d)
print('*'*50)
a.append(120)
#c[0].append(120)
print(c)
print(d)
print('*'*50)
a = [11,22,33]
b = [44,55,66]
c = (a,b)
d = copy.copy(c)
print(id(c))
print(id(d))
print(c)
print(d)
print('*'*50)
a.append(120)
#c[0].append(120)
print(c)
print(d)
五.生成器
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
(一).列表生成式
L = [ x*2 for x in range(5) ]
[0,2,4,6,8]
(一).生成器
要创建一个生成器,有很多种方法。第一种方法很简单,只要把一个列表生成式的[ ]改成( )
1.1
ge=(x*x for x in range(10))
#print(next(ge)) #通过next()一个一个的打印出来
#print(next(ge))
#print(next(ge))
#for i in ge: #通过for循环打印
#print(i)
n=0
while n<6: #具体要打印的内容
next(ge)
n+=1
print(next(ge))
1.2 yield