Python列表(List)深度解析

在這里插入圖片描述

列表(List)是Python中最基礎且強大的數據結構之一,但它的底層實現和特性遠比表面看起來復雜。本文將深入探討列表的各個方面。

1. 列表基礎特性

1.1 可變序列類型

lst = [1, 2, 3]
lst[1] = 20  # 可變性

1.2 異構容器

mixed = [1, "hello", 3.14, [1, 2]]  # 可以包含不同類型

2. 底層實現原理

Python列表實際上是動態數組的實現,其關鍵特性:

  • 動態擴容:當空間不足時,會按照約1.125倍(具體實現可能不同)進行擴容
  • 連續內存:元素在內存中是連續存儲的(存儲的是對象引用而非對象本身)
  • 預留空間:分配的空間通常比實際使用的多,以減少頻繁擴容
import sys
lst = []
for i in range(10):print(f"長度: {len(lst):2d}, 實際分配大小: {sys.getsizeof(lst)}字節")lst.append(i)

3. 時間復雜度分析

操作時間復雜度說明
索引/取值O(1)直接計算內存偏移
追加(append)平均O(1)可能觸發擴容
插入(insert)O(n)需要移動元素
刪除(del/pop)O(n)需要移動元素
包含判斷(in)O(n)需要遍歷
切片O(k)k是切片大小

4. 列表推導式 vs 循環創建

# 列表推導式(更快,更Pythonic)
squares = [x**2 for x in range(10)]# 等效循環
squares = []
for x in range(10):squares.append(x**2)

列表推導式:

  1. 在字節碼層面更高效
  2. 有專門的優化處理
  3. 可讀性更強(對于簡單轉換)

5. 淺拷貝與深拷貝

import copyoriginal = [[1, 2], [3, 4]]
shallow = original.copy()      # 淺拷貝
deep = copy.deepcopy(original) # 深拷貝original[0][0] = 99
print(shallow)  # [[99, 2], [3, 4]] - 內部列表被共享
print(deep)     # [[1, 2], [3, 4]]  - 完全獨立

6. 列表常用模式

6.1 過濾

numbers = [1, 2, 3, 4, 5]
evens = [x for x in numbers if x % 2 == 0]

6.2 展平

nested = [[1, 2], [3, 4], [5]]
flat = [item for sublist in nested for item in sublist]

6.3 分組

data = [1, 2, 3, 4, 5, 6]
grouped = [data[i:i+2] for i in range(0, len(data), 2)]

7. 性能優化技巧

  1. 預分配空間:當知道大小時
lst = [None] * 1000  # 預分配
  1. 使用生成器表達式處理大數據
sum(x**2 for x in range(1000000))  # 不創建中間列表
  1. 避免頻繁中間插入:考慮使用collections.deque

8. 與其他序列類型比較

特性listtuplearray.arraynumpy.ndarray
可變性????
異構元素????
內存效率
數值計算中等

9. 高級用法

9.1 自定義排序

users = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]
users.sort(key=lambda x: x['age'], reverse=True)

9.2 列表作為棧和隊列

# 棧
stack = []
stack.append(1)  # push
stack.pop()      # pop# 隊列(效率不高)
queue = []
queue.append(1)  # enqueue
queue.pop(0)     # dequeue (O(n)操作)

10. 常見陷阱

  1. 可變默認參數
def bad_func(value, lst=[]):  # 同一個列表會被重復使用lst.append(value)return lst
  1. 循環中修改列表
# 危險!
lst = [1, 2, 3, 4]
for i, x in enumerate(lst):if x % 2 == 0:del lst[i]  # 會跳過元素或越界
  1. 淺拷貝問題
a = [[]] * 3
a[0].append(1)  # 所有子列表都會被修改

列表是Python的核心數據結構,理解其底層實現和特性對于編寫高效Python代碼至關重要。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76681.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76681.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76681.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java基礎-設計模式詳解

摘要:設計模式是軟件工程中解決常見問題的經典方案。本文結合Java語言特性,深入解析常用設計模式的核心思想、實現方式及實際應用場景,幫助開發者提升代碼質量和可維護性。 一、設計模式概述 1.1 什么是設計模式? 設計模式&…

Docker 構建鏡像異常報錯解決

報錯一: # 啟動 SSH Agent eval $(ssh-agent -s)# 添加私鑰到 agent (替換為你的實際密鑰路徑) ssh-add ~/.ssh/id_ed25519# 驗證密鑰已加載 ssh-add -L# 查看 SSH_AUTH_SOCK 是否設置 echo $SSH_AUTH_SOCK # 應輸出類似:/tmp/ssh-XXXXXX/agent.XXXX# 顯…

動態規劃似包非包系列一>組合總和IIV

目錄 題目分析:狀態表示:狀態轉移方程:初始化填表順序返回值:代碼呈現: 題目分析: 狀態表示: 狀態轉移方程: 初始化填表順序返回值: 代碼呈現: class Soluti…

Linux下調試器gdb_cgdb使用

文章目錄 一、樣例代碼二、使用watchset var確定問題原因條件斷點 一、樣例代碼 #include <stdio.h>int Sum(int s, int e) {int result 0;int i;for(i s; i < e; i){result i;}return result; }int main() {int start 1;int end 100;printf("I will begin…

JSON Crack:簡化數據可視化的參數編輯器

簡介 在當今數據驅動的世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作為一種輕量級的數據交換格式&#xff0c;廣泛應用于各種開發和數據分析場景。然而&#xff0c;復雜的JSON數據往往難以閱讀和理解&#xff0c;特別是在數據量龐大時&#xf…

PostgreSQL 刪除數據庫

PostgreSQL 刪除數據庫 概述 PostgreSQL 是一款功能強大的開源關系型數據庫管理系統&#xff0c;它提供了豐富的功能和強大的性能。在數據庫管理過程中&#xff0c;有時需要刪除不再需要的數據庫&#xff0c;以釋放資源或進行數據庫維護。本文將詳細介紹如何在 PostgreSQL 中…

Linux內核物理內存組織結構

一、系統調用sys_mmap 系統調用mmap用來創建內存映射&#xff0c;把創建內存映射主要的工作委托給do_mmap函數&#xff0c;內核源碼文件處理&#xff1a;mm/mmap.c 二、系統調用sys_munmap 1、vma find_vma (mm, start); // 根據起始地址找到要刪除的第一個虛擬內存區域 vma 2…

Mac強制解鎖APP或文件夾

當Mac安裝過火絨企業版、云安全訪問服務之類的APP需要卸載的時候&#xff0c;會發現需要管理員密碼&#xff0c;正常的卸載流程走不下去&#xff0c;直接刪除APP&#xff0c;會提示“不能完成此操作&#xff0c;xxx已鎖定”的信息&#xff0c;此處就記錄一下如何關閉鎖定狀態&a…

Mixed Content: The page at https://xxx was loaded over HTTPS

一、核心原因分析 Mixed Content 警告是由于 HTTPS 頁面中引用了 HTTP 協議的資源(如腳本、圖片、iframe 等),導致瀏覽器因安全策略阻止加載這些非加密內容。HTTP 資源可能被中間人攻擊篡改,破壞 HTTPS 頁面的整體安全性。 二、推薦解決方案 1. 強制資源升級為 HTTPS ?…

ARXML文件解析-1

目錄 1 摘要2 ARXML文件2.1 作用及典型應用場景2.2 **ARXML文件的結構樹**2.3 TAG&#xff08;XML元素&#xff09;2.4 ARXML文件關鍵元素解析2.4.1 XML聲明與處理指令2.4.2 XML注釋2.4.3 ADMIN-DATA元素2.4.3 語言相關元素2.4.5 AR-PACKAGE體系結構2.4.6. 數據轉換框架2.4.7 S…

[ISP 3A ] AE的常用算法分析

&#x1f4cc; 自動曝光&#xff08;AE, Auto Exposure&#xff09;解析 自動曝光&#xff08;AE&#xff09;是相機通過調節 曝光參數&#xff08;增益、快門時間、光圈等&#xff09;來確保拍攝出的圖像亮度適宜的算法。AE 需要根據環境光線變化自動調整曝光&#xff0c;以避…

大模型學習二:DeepSeek R1+蒸餾模型組本地部署與調用

一、說明 DeepSeek R1蒸餾模型組是基于DeepSeek-R1模型體系&#xff0c;通過知識蒸餾技術優化形成的系列模型&#xff0c;旨在平衡性能與效率。 1、技術路徑與核心能力 基礎架構與訓練方法? ?DeepSeek-R1-Zero?&#xff1a;通過強化學習&#xff08;RL&#xff09;訓練&…

STM32入門學習筆記(持續更新)

b站江協科技資料 通過網盤分享的文件&#xff1a;STM32入門教程資料 鏈接: https://pan.baidu.com/s/1-rOi83sUK8CqUNsHQuvxew?pwd8krh 提取碼: 8krh LED燈閃爍0402 #include "stm32f10x.h" // Device header #include "Delay.h"int m…

企業安全——FIPs

0x00 前言 先來看一道題目。這道題目涉及到的就是道德規范和互聯網相關內容&#xff0c;本文會對相關內容進行描述和整理。 正確答案是&#xff1a;D 注意FIPs的主要目的是為了限制&#xff0c;也就是針對數據的守則。 0x01 RFC 1087 1989年1月 互聯網架構委員會 IAB 發布了…

【Linux系統編程】進程概念,進程狀態

目錄 一&#xff0c;操作系統&#xff08;Operator System&#xff09; 1-1概念 1-2設計操作系統的目的 1-3核心功能 1-4系統調用和庫函數概念 二&#xff0c;進程&#xff08;Process&#xff09; 2-1進程概念與基本操作 2-2task_struct結構體內容 2-3查看進程 2-4通…

基于TradingView和CTPBee的自動化期貨交易系統實現

引言 在量化交易領域&#xff0c;TradingView因其強大的技術分析工具和豐富的指標庫而廣受歡迎&#xff0c;但是其不支持國內期貨自動化交易&#xff0c;CTPBee則是一個優秀的國產Python期貨交易接口。本文將介紹如何將兩者結合&#xff0c;實現一個完整的自動化交易系統。 本…

初始ARM

ARM最基礎的組成單元。 最小系統&#xff1a;能系統能夠正常工作的最少器件構成的系統 。 一、CPU基礎定義 ALU&#xff08;運算單元&#xff09;&#xff1a; 負責執行算術和邏輯運算&#xff0c;是處理器的核心部分。 寄存器&#xff08;R0, R1, R12&#xff09;&#xff…

通信數據記錄儀-產品概念ID

總結: 1、支持高速CAN、支持容錯CAN、支持單線CAN(理解是支持不同的協議,CANFD、CAN2.0和LIN?) 2、 通過上位機設計時間

Qt QTableView QAbstractTableModel實現復選框+代理實現單元格編輯

話不多說&#xff0c;直接看代碼 一、Model 1、QTableModel_Test.h #pragma once#include <QAbstractTableModel> #include <QObject> #include <QModelIndex>class QTableModel_Test : public QAbstractTableModel {Q_OBJECT public:QTableModel_Test(Q…

JavaWeb學習--MyBatis-Plus整合SpringBoot的ServiceImpl方法(增加,修改與刪除部分)

接下來是常用的增加&#xff0c;修改以及刪除部分 首先是增加部分&#xff0c;增加一個新的數據 Testpublic void testInsert() {// 添加一個新用戶記錄Student s new Student();s.setName("NewStudent");s.setAge(25);boolean saved studentService.save(s);//可以…