== 与is 的使用
==是比较两个对象是否相等,是值的比较
is 是判断两个引用是否指
向了同一个对象,是引用地址的比较
浅拷贝 与 深拷贝
浅拷贝是拷贝了引用地址,没有拷贝内容 ,一方修改,另一方也会受到影响 赋值就是一个浅拷贝
'''
深拷贝:递归拷贝 深拷贝是内容一样,地址不一样
一方修改,另一方不受影响
b = copy.deepcopy(a) a,b内容一样,地址不一样 a如果修改了,b不受影响
如果a中有对象引用,也会拷贝到b中,内容一样,地址不一样
'''
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]
b = [4,5,6]
c=(a,b)
d = copy.deepcopy(c) # 深拷贝
print(id(c))
print(id(d))
print(c)
print(d)
a.append(0)
print(c)
print(d)
copy.copy() 函数
'''
copy.copy() 方法 结果会因为是可变或者不可变导致结果不同
只能拷贝一层
根据类型有关。如果是列表(可变类型),深拷贝。如果是元组(不可变)浅拷贝
如果里面还有嵌套的对象,浅拷贝
如果是嵌套的可变的,外层如果是可变的,拷贝外层相当于深拷贝,地址不一样,
但内层可变类型的值变化,都会受到影响
如果外层是不可变的,内层是可变的,拷贝结果是浅拷贝,地址一样,内容也一样,
一方改变,另一方也受影响
'''
a = (1,2,3)
b = copy.copy(a) # 相当于浅拷贝
print(id(a))
print(id(b))
print(a)
print(b)
生成器 generator
python中一边循环一边生成的机制,叫做生成器 generator
创建生成器:
如果要一个一个打印出来可以通过 next(g)函数获得生成器的下一个返回值
创建生成器的第二种方式:
yield 值
1、调用函数,得到一个生成器对象。这个函数没有执行
2、next调用得到的对象,如果遇到了yield,代码会阻塞,next的返回值就yield后的值
但是用for循环调用generator时,发现拿不到generator的return语句的返回值 要拿到返回值,这时就需要捕获异常啦
生成器的特点:
1,节约内存,
2,迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的