列表推導式棋返、深淺拷貝

本文將會總結以下幾個知識點:

  • 列表推導式
  • ==is
  • 深拷貝和淺拷貝

列表推導式

需求:如果我們想生成一個連續(xù)的列表,可以采用哪些方式呢蒸甜?首先可以使用 forwhile 循環(huán):

def createList(num):
    lis = []
    for i in range(num):
        lis.append(i)
    return lis

print(createList(10))
def createList(num):
    lis = []
    count = 0
    while True:
        if num == count:
            break;
        else:
            count += 1
            lis.append(count)
    return lis

print(createList(10))

如果我們想在生成列表的時候進行篩選棠耕,可以這樣做:

def createList(num):
    lis = []
    for i in range(num):
        if not i%2:
            lis.append(i)

    return lis

print(createList(10))
def createList(num):
    lis = []
    count = 0
    while True:
        if num == count:
            break;
        else:
            count += 1
            if not count % 2:
                lis.append(count)
    return lis

print(createList(10))

上面的代碼可以生成任何我們想要的列表余佛,但是代碼量有點多,因此窍荧,Python 提供了列表推導式讓我們快捷生成列表辉巡,其格式為:

[ 變量 for 表達式 判斷條件 ]

上面的變量有且只能有一個,如果需要多個變量蕊退,可以采用列表或元組的方式實現(xiàn)郊楣。下面是一些常見用途:
1.生成一個列表:

def createList(num):
    return [i for i in range(num)]

print(createList(10))

運行結果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2.生成列表時進行篩選:

def createList(num):
    return [i for i in range(num) if not i%2]

print(createList(10))

運行結果:

[0, 2, 4, 6, 8]

3.循環(huán)嵌套,生成多維列表

def createList(num):
    return [(i,j) for i in range(num) for j in range(3)]

print(createList(3))

運行結果:

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

上面就是列表推導式的簡單用法瓤荔。

==is

Python 中痢甘,== 用來判斷兩個變量的值是否相同,is 用來判斷兩個變量是否指向同一塊內存空間茉贡。
看如下實例:

a = [1,2,3]
b = a
c = [1,2,3]
d = [1,2,3,4]

print("a == b: %s"%(a == b))
print("a == c: %s"%(a == c))
print("b == c: %s"%(b == c))
print("a == d: %s"%(a == d))

運行結果:

a == b: True
a == c: True
b == c: True
a == d: False

如上塞栅,ab腔丧,c 三個變量的值相同放椰,都是 [1,2,3],因此使用 == 操作符判斷的結果為 True愉粤,a砾医,bcd 的值不相同衣厘,因此判斷的結果為 False如蚜。
再來看下 is 運算符:

a = [1,2,3]
b = a
c = [1,2,3]
d = [1,2,3,4]

print("a == b: %s"%(a is b))
print("a == c: %s"%(a is c))
print("b == c: %s"%(b is c))
print("a == d: %s"%(a is d))

運行結果:

a == b: True
a == c: False
b == c: False
a == d: False

上例中,只有 ab 變量指向同一塊內存影暴,因此對它們使用 is 操作符判斷的結果為 True错邦,而其他的幾個判斷返回 True

深拷貝和淺拷貝

實現(xiàn)深拷貝和淺拷貝型宙,可以使用函數(shù)遞歸完成撬呢,也可以使用 Python 內置的 copy 模塊。深拷貝使用 deepcopy 函數(shù)妆兑,淺拷貝使用 copy 函數(shù)魂拦。
深拷貝和淺拷貝的區(qū)別如下:

  • 深拷貝會對變量進行遞歸拷貝,拷貝后的值和原始值之間沒有引用關系
  • 淺拷貝只對變量的外層進行拷貝搁嗓,拷貝后內層值與原始值之間扔存在引用關系

看一下深拷貝的例子:

from copy import deepcopy

a = [1,2,3]
b = [4,5,6]
# c 中保存了 a 和 b 的引用芯勘,修改 a 和 b 的值會同步影響到 c 的值
c = [a,b]
# 對 c 進行深拷貝
d = deepcopy(c)
# 修改 a 的值
a.append(666)
# 打印 c 和 d
print(c)
print(d)
print(c is d)

運行結果如下:

[[1, 2, 3, 666], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
False

進行深拷貝時,會對變量內部一層一層進行遞歸拷貝腺逛,拷貝到新變量中的值和原始值之間沒有引用關系荷愕,修改原始值不會影響到新變量中的值。示意圖如下:


深拷貝示意圖.png

接下看看一下淺拷貝的例子:

from copy import copy

a = [1,2,3]
b = [4,5,6]
# c 中保存了 a 和 b 的引用,修改 a 和 b 的值會同步影響到 c 的值
c = [a,b]
# 對 c 進行淺拷貝
d = copy(c)
# 修改 a 的值
a.append(666)
# 打印 c 和 d
print(c)
print(d)
print(c is d)

運行結果如下:

[[1, 2, 3, 666], [4, 5, 6]]
[[1, 2, 3, 666], [4, 5, 6]]
False

可見路翻,淺拷貝只能對外層進行拷貝狈癞,而對于內層的值不會進行拷貝,仍然指向原始的引用茂契。示意圖如下:

淺拷貝示意圖.png

對元組進行淺拷貝

修改代碼蝶桶,實現(xiàn)對元組進行淺拷貝:

from copy import copy

a = [1,2,3]
b = [4,5,6]
c = (a,b)
d = copy(c)
print(c is d)
print(id(c),id(d))

運行結果如下:

True
17322512 17322512

修改代碼,實現(xiàn)對元組進行深拷貝:

from copy import deepcopy

a = [1,2,3]
b = [4,5,6]
c = (a,b)
d = deepcopy(c)
print(c is d)
print(id(c),id(d))

運行結果如下:

False
15881080 15207040

可見掉冶,進行淺拷貝時真竖,如果是不可變類型,則不會對外層進行拷貝厌小,調用 copy 函數(shù)的返回值仍然是指向原始值的一個引用恢共,進行深拷貝時才會對外層和內層進行拷貝,這點需要注意璧亚。

完讨韭。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市癣蟋,隨后出現(xiàn)的幾起案子透硝,更是在濱河造成了極大的恐慌,老刑警劉巖疯搅,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件濒生,死亡現(xiàn)場離奇詭異,居然都是意外死亡幔欧,警方通過查閱死者的電腦和手機罪治,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來礁蔗,“玉大人觉义,你說我怎么就攤上這事∈蒴铮” “怎么了谁撼?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滋饲。 經(jīng)常有香客問我,道長喊巍,這世上最難降的妖魔是什么屠缭? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮崭参,結果婚禮上呵曹,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好奄喂,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布铐殃。 她就那樣靜靜地躺著,像睡著了一般跨新。 火紅的嫁衣襯著肌膚如雪富腊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天域帐,我揣著相機與錄音赘被,去河邊找鬼。 笑死肖揣,一個胖子當著我的面吹牛民假,可吹牛的內容都是我干的。 我是一名探鬼主播龙优,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼羊异,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了彤断?” 一聲冷哼從身側響起野舶,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓦糟,沒想到半個月后筒愚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡菩浙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年巢掺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劲蜻。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡陆淀,死狀恐怖,靈堂內的尸體忽然破棺而出先嬉,到底是詐尸還是另有隱情轧苫,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布疫蔓,位于F島的核電站含懊,受9級特大地震影響,放射性物質發(fā)生泄漏衅胀。R本人自食惡果不足惜岔乔,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滚躯。 院中可真熱鬧雏门,春花似錦嘿歌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至募闲,卻和暖如春步脓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝇更。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工沪编, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人年扩。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓蚁廓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厨幻。 傳聞我的和親對象是個殘疾皇子相嵌,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,348評論 25 707
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,171評論 30 470
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)况脆,斷路器饭宾,智...
    卡卡羅2017閱讀 134,720評論 18 139
  • 十年前,高齡未婚格了。用后來的流行詞叫“資深剩女”看铆。 青春熱烈而美好,那時內心追求的盛末,是像影視劇里的樣子:有純純的愛情...
    暖香閣主閱讀 444評論 1 1
  • 對于日本似乎我們總有說不完的話題弹惦,總是喜歡說作為一名中國人,要勿忘國恥悄但,銘記歷史棠隐! 我所熟悉的應試教育,也讓我聯(lián)想...
    我是一直流浪的豬閱讀 597評論 0 1