== 與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,迭代到下一次的調用時,所使用的參數都是第一次所保留下的,即是說,在整個所有函數調用的參數都是第一次所調用時保留的,而不是新創建的