亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python列表嵌套引發(fā)的問題總結(jié)

 更新時間:2022年05月20日 09:10:16   作者:Python熱愛者  
這篇文章主要介紹了python列表嵌套引發(fā)的問題總結(jié),下面問文章引發(fā)問題來自日常工作總結(jié),具有一定的參考價值需要的小伙伴可以參考一下

1.嵌套列表

Python中有一種內(nèi)置的數(shù)據(jù)類型叫列表(list),它是一種容器,可以用來承載其他的對象(準(zhǔn)確的說是其他對象的引用),列表中的對象可以稱為列表的元素,很明顯我們可以把列表作為列表中的元素,這就是所謂的嵌套列表。

嵌套列表可以模擬出現(xiàn)實中的表格、矩陣、2D游戲的地圖(如植物大戰(zhàn)僵尸的花園)、棋盤(如國際象棋、黑白棋)等。

2.識別坑點

在使用嵌套的列表時要小心,否則很可能遭遇非常尷尬的情況,下面是一個小例子:

def main():
names = ['關(guān)羽', '張飛', '趙云', '馬超', '黃忠']
subjs = ['語文', '數(shù)學(xué)', '英語']
scores = [[0] * 3] * 5
for row, name in enumerate(names):
print('請輸入%s的成績' % name)
for col, subj in enumerate(subjs):
scores[row][col] = float(input(subj + ': '))
print(scores)
if __name__ == '__main__':
main()

我們希望錄入5個學(xué)生3門課程的成績,于是定義了一個有5個元素的列表,而列表中的每個元素又是一個由3個元素構(gòu)成的列表,這樣一個列表的列表剛好跟一個表格是一致的,相當(dāng)于有5行3列。

接下來我們通過嵌套的for-in循環(huán)輸入每個學(xué)生3門課程的成績。程序執(zhí)行完成后我們發(fā)現(xiàn),每個學(xué)生3門課程的成績是一模一樣的(尷尬),而且就是最后錄入的那個學(xué)生的成績。

3.區(qū)分兩個概念

要想把這個坑填平,我們首先要區(qū)分對象和對象的引用這兩個概念,而要區(qū)分這兩個概念,還得先說說內(nèi)存中的棧和堆。

我們經(jīng)常會聽人說起“堆棧”這個詞,但實際上“堆”和“棧”是兩個不同的概念。眾所周知,一個程序運行時需要占用一些內(nèi)存空間來存儲數(shù)據(jù)和代碼,那么這些內(nèi)存從邏輯上又可以做進(jìn)一步的劃分。

對底層語言(如C語言)有所了解的程序員大都知道,程序中可以使用的內(nèi)存從邏輯上可以為五個部分,按照地址從高到低依次是:棧(stack)、堆(heap)、數(shù)據(jù)段(data segment)、只讀數(shù)據(jù)段(static area)和代碼段(code segment)。

棧用來存儲局部、臨時變量,以及函數(shù)調(diào)用時保存現(xiàn)場和恢復(fù)現(xiàn)場需要用到的數(shù)據(jù),這部分內(nèi)存在代碼塊開始執(zhí)行時自動分配,代碼塊執(zhí)行結(jié)束時自動釋放,通常由編譯器自動管理。

堆的大小不固定,可以動態(tài)的分配和回收,因此如果程序中有大量的數(shù)據(jù)需要處理,這些數(shù)據(jù)通常都放在堆上,如果堆空間沒有正確的被釋放會引發(fā)內(nèi)存泄露的問題,而像Python、Java等編程語言都使用了垃圾回收機(jī)制來實現(xiàn)自動化的內(nèi)存管理(自動回收不再使用的堆空間)。

4.小例子

所以,下面的代碼中,變量a并不是真正的對象,它是對象的引用,相當(dāng)于記錄了對象在堆空間的地址,通過這個地址我們可以訪問到對應(yīng)的對象。

a = object()
b = ['apple', 'pitaya', 'grape']

同理,變量b是列表容器的引用,它引用了堆空間上的列表容器,而列表容器中并沒有保存真正的對象,它保存的也僅僅是對象的引用。

知道了這一點,我們可以回過頭看看剛才的程序,我們對列表進(jìn)行[[0]* 3] * 5操作時,僅僅是將[0, 0, 0] 這個列表的地址進(jìn)行了復(fù)制,并沒有創(chuàng)建新的列表對象。

所以,容器中雖然有5個元素,但是這5個元素引用了同一個列表對象。這一點可以通過id函數(shù)檢查scores[0]和scores[1]的地址得到證實。在此我們舉一個小例子,讀者朋友們可以敲一敲加深印象。

a = [[0]*3]*5id(a[0])
id(a[1])
# id相等

5.正確代碼

所以,正確的代碼應(yīng)該按照如下的方式進(jìn)行修改:

def main():
names = ['關(guān)羽', '張飛', '趙云', '馬超', '黃忠']
subjs = ['語文', '數(shù)學(xué)', '英語']
scores = [[]] * 5
for row, name in enumerate(names):
print('請輸入%s的成績' % name)
scores[row] = [0] * 3 #變?yōu)椴辉偾短?
for col, subj in enumerate(subjs):
scores[row][col] = float(input(subj + ': '))
print(scores)
if __name__ == '__main__':
main()

或者:

def main():
names = ['關(guān)羽', '張飛', '趙云', '馬超', '黃忠']
subjs = ['語文', '數(shù)學(xué)', '英語']
scores = [[0] * 3 for _ in range(5)]
for row, name in enumerate(names):
print('請輸入%s的成績' % name)
scores[row] = [0] * 3
for col, subj in enumerate(subjs):
scores[row][col] = float(input(subj + ': '))
print(scores)
if __name__ == '__main__':
main()

總結(jié)

本文介紹使用嵌套列表需要注意的問題及解決措施,以此避免在使用嵌套列表或者復(fù)制對象時可能遇到的坑。

到此這篇關(guān)于python列表嵌套引發(fā)的問題總結(jié)的文章就介紹到這了,更多相關(guān)python列表嵌套內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用機(jī)器學(xué)習(xí)預(yù)測房價

    利用機(jī)器學(xué)習(xí)預(yù)測房價

    這篇文章主要介紹了利用機(jī)器學(xué)習(xí)回歸模型預(yù)測房價,解釋清晰,代碼詳細(xì),是很不錯的機(jī)器學(xué)習(xí)實戰(zhàn)演練,對機(jī)器學(xué)習(xí)感興趣的朋友可以參考一下
    2021-04-04
  • Python的代理類實現(xiàn),控制訪問和修改屬性的權(quán)限你都了解嗎

    Python的代理類實現(xiàn),控制訪問和修改屬性的權(quán)限你都了解嗎

    這篇文章主要為大家詳細(xì)介紹了Python的代理類實現(xiàn),控制訪問和修改屬性的權(quán)限,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Python 對象中的數(shù)據(jù)類型

    Python 對象中的數(shù)據(jù)類型

    對于python,一切事物都是對象,程序中存儲的所有數(shù)據(jù)都是對象,對象基于類創(chuàng)建。這篇文章主要介紹了Python 對象之?dāng)?shù)據(jù)類型 ,需要的朋友可以參考下
    2017-05-05
  • 在Tensorflow中實現(xiàn)leakyRelu操作詳解(高效)

    在Tensorflow中實現(xiàn)leakyRelu操作詳解(高效)

    這篇文章主要介紹了在Tensorflow中實現(xiàn)leakyRelu操作詳解(高效),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Sublime?Text4?配置?Python3?環(huán)境、代碼提示、編譯報錯的解決方案

    Sublime?Text4?配置?Python3?環(huán)境、代碼提示、編譯報錯的解決方案

    這篇文章主要介紹了Sublime?Text4?配置?Python3?環(huán)境、代碼提示、編譯報錯教程,通過圖文并茂的形式給大家介紹了配置自動代碼提示的方法,需要的朋友可以參考下
    2022-01-01
  • Python使用Networkx實現(xiàn)復(fù)雜的人物關(guān)系圖

    Python使用Networkx實現(xiàn)復(fù)雜的人物關(guān)系圖

    日常工作、生活中我們經(jīng)常會遇到一些復(fù)雜的事務(wù)關(guān)系,比如人物關(guān)系,那如何才能清楚直觀的看清楚這些任務(wù)關(guān)系呢?所以小編給大家介紹了Python如何使用Networkx實現(xiàn)復(fù)雜的人物關(guān)系圖,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • python實現(xiàn)在cmd窗口顯示彩色文字

    python實現(xiàn)在cmd窗口顯示彩色文字

    今天小編就為大家分享一篇python實現(xiàn)在cmd窗口顯示彩色文字,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 解決python字典對值(值為列表)賦值出現(xiàn)重復(fù)的問題

    解決python字典對值(值為列表)賦值出現(xiàn)重復(fù)的問題

    今天小編就為大家分享一篇解決python字典對值(值為列表)賦值出現(xiàn)重復(fù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 淺談numpy生成數(shù)組的零值問題

    淺談numpy生成數(shù)組的零值問題

    今天小編就為大家分享一篇淺談numpy生成數(shù)組的零值問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python變量基礎(chǔ)知識

    Python變量基礎(chǔ)知識

    這篇文章主要介紹Python變量的基礎(chǔ)知識,圍繞Python變量相關(guān)知識點展開,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-10-10

最新評論