一. 'is'? '=='
總結(jié)
·is是比較兩個引用是否指向了同一個對象(地址引用比較)。
·==是比較兩個對象是否相等蝇狼。(比較的數(shù)值)
二. 淺拷貝'
淺拷貝:
拷貝的是地址引用迅耘。可以找到共同的內(nèi)容一方修改了纽哥,另一方受影響
a = [1,2,3,4]
b = a
print(id(a))
print(id(b))
a.append(5)
print(a)
print(b)
三 深拷貝'
深拷貝:
深拷貝的是內(nèi)容一樣春塌。地址不一樣簇捍。一方修改了曾我,另一方不受影響
b = copy.deepcopy(a)碑幅,b得到的內(nèi)容與a的內(nèi)容完全一樣命辖,地址不一樣。
就算a中有對象引用尔艇,b中對應(yīng)的引用的對象依然是內(nèi)容一樣,地址不一樣味廊。
遞歸拷貝
注意:
如果是一個不可變對象(內(nèi)部存儲還是不可變對象)余佛,深拷貝的結(jié)果 = 淺拷貝窍荧,地址一樣
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這個函數(shù)結(jié)果會因為是可變或者不可變導(dǎo)致結(jié)果不同
只能拷貝一層郊楣。根據(jù)類型有關(guān)瓤荔。如果是列表(可變類型),深拷貝今瀑。如果是元組(不可變)淺拷貝
如果里面還有嵌套的對象点把,淺拷貝
import copy
'''
a = [1,2,3,4]
#相當(dāng)于深拷貝
b = copy.copy(a)
print(id(a))
print(id(b))
a.append(5)
print(a)
print(b)
print('*'*50)
a = (1,2,3,4)
#相當(dāng)于淺拷貝
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中,這種一邊循環(huán)一邊計算的機制拿撩,稱為生成器:generator。
(一).列表生成式
L = [ x*2 for x in range(5)? ]
[0,2,4,6,8]
(一).生成器
要創(chuàng)建一個生成器影暴,有很多種方法型宙。第一種方法很簡單伦吠,只要把一個列表生成式的[ ]改成( )
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循環(huán)打印
#print(i)
n=0
while n<6:? ? ? ? ? ? #具體要打印的內(nèi)容
next(ge)
n+=1
print(next(ge))
1.2 yield