最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python列表嵌套常見坑點及解決方案

 更新時間:2020年09月30日 11:56:04   作者:lincappu  
這篇文章主要介紹了Python列表嵌套常見坑點及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1.嵌套列表

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

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

2.識別坑點

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

def main():  names = ['關羽', '張飛', '趙云', '馬超', '黃忠']  subjs = ['語文', '數學', '英語']  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()
  names = ['關羽', '張飛', '趙云', '馬超', '黃忠']
  subjs = ['語文', '數學', '英語']
  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個學生3門課程的成績,于是定義了一個有5個元素的列表,而列表中的每個元素又是一個由3個元素構成的列表,這樣一個列表的列表剛好跟一個表格是一致的,相當于有5行3列。

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

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

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

我們經常會聽人說起“堆?!边@個詞,但實際上“堆”和“?!笔莾蓚€不同的概念。眾所周知,一個程序運行時需要占用一些內存空間來存儲數據和代碼,那么這些內存從邏輯上又可以做進一步的劃分。

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

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

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

4。小例子

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

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

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

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

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

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

5。正確代碼

所以,正確的代碼應該按照如下的方式進行修改。

def main():  names = ['關羽', '張飛', '趙云', '馬超', '黃忠']  subjs = ['語文', '數學', '英語']  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()'關羽', '張飛', '趙云', '馬超', '黃忠']
  subjs = ['語文', '數學', '英語']
  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 = ['關羽', '張飛', '趙云', '馬超', '黃忠']  subjs = ['語文', '數學', '英語']  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()
  names = ['關羽', '張飛', '趙云', '馬超', '黃忠']
  subjs = ['語文', '數學', '英語']
  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()

以上就是使用嵌套列表需要注意的問題及解決措施,希望大家多多總結,以此避免在使用嵌套列表或者復制對象時可能遇到的坑。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python二分法搜索算法實例分析

    Python二分法搜索算法實例分析

    這篇文章主要介紹了Python二分法搜索算法,實例分析了Python實現(xiàn)二分法的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • opencv python 圖像輪廓/檢測輪廓/繪制輪廓的方法

    opencv python 圖像輪廓/檢測輪廓/繪制輪廓的方法

    這篇文章主要介紹了opencv python 圖像輪廓/檢測輪廓/繪制輪廓的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • 提升Python程序性能的7個習慣

    提升Python程序性能的7個習慣

    這篇文章主要介紹了提升Python程序性能的7個習慣,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • python中os模塊詳解

    python中os模塊詳解

    os模塊提供了多數操作系統(tǒng)的功能接口函數.當os模塊被導入后,它會自適應于不同的操作系統(tǒng)平臺,如posix或NT系統(tǒng)平臺,os模塊會根據不同的平臺進行相應的操作.本節(jié)內容將對os模塊提供的函數進行詳細的解讀.
    2016-10-10
  • Python對字符串實現(xiàn)去重操作的方法示例

    Python對字符串實現(xiàn)去重操作的方法示例

    字符串去重是python中字符串操作常見的一個需求,最近在工作中就又遇到了,所以下面這篇文章主要給大家介紹了關于Python對字符串實現(xiàn)去重操作的相關資料,文中給出了詳細的介紹,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • Python3進行表格數據處理的示例詳解

    Python3進行表格數據處理的示例詳解

    數據處理是一個當下非常熱門的研究方向,通過對于大型實際場景中的數據進行建模,可以用于預測下一階段可能出現(xiàn)的情況。本文就來聊聊Python3進行表格數據處理的相關操作,需要的可以參考一下
    2023-03-03
  • Python基礎語言學習筆記總結(精華)

    Python基礎語言學習筆記總結(精華)

    給大家分享一篇關于Python基礎學習內容的學習筆記整理總結篇,里面匯集了學習Python基礎語言的難點和技巧,分享給大家。
    2017-11-11
  • Python和OpenCV自制訪客識別程序

    Python和OpenCV自制訪客識別程序

    這篇文章主要為大家詳細介紹了如何使用Python和OpenCV自制訪客識別程序,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-11-11
  • flask使用session保存登錄狀態(tài)及攔截未登錄請求代碼

    flask使用session保存登錄狀態(tài)及攔截未登錄請求代碼

    這篇文章主要介紹了flask使用session保存登錄狀態(tài)及攔截未登錄請求代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 詳解centos7+django+python3+mysql+阿里云部署項目全流程

    詳解centos7+django+python3+mysql+阿里云部署項目全流程

    這篇文章主要介紹了詳解centos7+django+python3+mysql+阿里云部署項目全流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11

最新評論

额济纳旗| 金寨县| 韶山市| 澄城县| 翁牛特旗| 万山特区| 浦县| 平陆县| 太仆寺旗| 朝阳区| 中卫市| 西乌珠穆沁旗| 洮南市| 巴东县| 彭山县| 浦北县| 抚松县| 临泽县| 沅陵县| 搜索| 桂平市| 昌邑市| 裕民县| 连云港市| 大理市| 安图县| 雅安市| 莫力| 宜春市| 兴仁县| 宁武县| 兰溪市| 拉萨市| 乌兰察布市| 天柱县| 乌拉特中旗| 永修县| 临沂市| 泽普县| 禄劝| 清河县|