Python 序列構成的數組(對序列使用+和_)

對序列使用+和*

Python 程序員會默認序列是支持 + 和 * 操作的。通常 + 號兩側的序列由
相同類型的數據所構成,在拼接的過程中,兩個被操作的序列都不會被
修改,Python 會新建一個包含同樣類型數據的序列來作為拼接的結果。

如果想要把一個序列復制幾份然后再拼接起來,更快捷的做法是把這個
序列乘以一個整數。同樣,這個操作會產生一個新序列:

>>> l = [1, 2, 3]
>>> l * 5
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> 5 * 'abcd'
'abcdabcdabcdabcdabcd'

+ 和 * 都遵循這個規律,不修改原有的操作對象,而是構建一個全新的
序列。

如果在 a * n 這個語句中,序列 a 里的元素是對其他可變
對象的引用的話,你就需要格外注意了,因為這個式子的結果可能
會出乎意料。比如,你想用 my_list = [[]] * 3 來初始化一個
由列表組成的列表,但是你得到的列表里包含的 3 個元素其實是 3
個引用,而且這 3 個引用指向的都是同一個列表。這可能不是你想
要的效果。

建立由列表組成的列表
有時我們會需要初始化一個嵌套著幾個列表的列表,譬如一個列表可能
需要用來存放不同的學生名單,或者是一個井字游戲板 上的一行方
塊。想要達成這些目的,最好的選擇是使用列表推導,見示例 2-12。
示例 2-12 一個包含 3 個列表的列表,嵌套的 3 個列表各自有 3 個
元素來代表井字游戲的一行方塊

>>> board = [['_'] * 3 for i in range(3)] ?
>>> board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
>>> board[1][2] = 'X' ?
>>> board
[['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]

? 建立一個包含 3 個列表的列表,被包含的 3 個列表各自有 3 個元
素。打印出這個嵌套列表。
? 把第 1 行第 2 列的元素標記為 X,再打印出這個列表。
示例 2-13 展示了另一個方法,這個方法看上去是個誘人的捷徑,但實
際上它是錯的。

示例 2-13 含有 3 個指向同一對象的引用的列表是毫無用處的

>>> weird_board = [['_'] * 3] * 3 ?
>>> weird_board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
>>> weird_board[1][2] = 'O' ?
>>> weird_board
[['_', '_', 'O'], ['_', '_', 'O'], ['_', '_', 'O']]

? 外面的列表其實包含 3 個指向同一個列表的引用。當我們不做修改
的時候,看起來都還好。
? 一旦我們試圖標記第 1 行第 2 列的元素,就立馬暴露了列表內的 3
個引用指向同一個對象的事實。

示例 2-13 犯的錯誤本質上跟下面的代碼犯的錯誤一樣:

row=['_'] * 3
board = []
for i in range(3):board.append(row) ?

? 追加同一個行對象(row)3 次到游戲板(board)。
相反,示例 2-12 中的方法等同于這樣做:

>>> board = []
>>> for i in range(3):
... row=['_'] * 3 # ?
... board.append(row)
...
>>> board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
>>> board[2][0] = 'X'
>>> board # ?
[['_', '_', '_'], ['_', '_', '_'], ['X', '_', '_']]

? 每次迭代中都新建了一個列表,作為新的一行(row)追加到游戲板
(board)。
? 正如我們所期待的,只有第 2 行的元素被修改。

我們一直在說 + 和 *,但是別忘了我們還有 += 和 *=。隨著目標序列的
可變性的變化,這個兩個運算符的結果也大相徑庭。

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

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

相關文章

[ C語言 ] | 從0到1?

目錄 認識計算機語言 C語言 工欲善其事必先利其器 第一個C語言代碼 這一些列 [ C語言 ] ,就來分享一下 C語言 相關的知識點~ 認識計算機語言 我們說到計算機語言,語言,就是用來溝通的工具,計算機語言呢?就是我們…

【通道注意力機制】【SENet】Squeeze-and-Excitation Networks

0.論文摘要 卷積神經網絡建立在卷積操作的基礎上,通過融合局部感受野內的空間和通道信息來提取有意義的特征。為了增強網絡的表示能力,最近的一些方法展示了增強空間編碼的好處。在本研究中,我們專注于通道關系,并提出了一種新穎…

kubernetes Calico(CNI) NetworkPolicy 流量管理 設置networkpolicy 策略 下集

1、kubernetes 網絡策略(網絡隔離策略) Network Policy 是 Kubernetes 中用于控制 Pod 之間網絡通信的一種機制。它通過定義規則,限制哪些 Pod 或外部實體可以與目標 Pod 通信(基于標簽、命名空間、端口等)。Network …

sqlmap基礎命令總結

?注意事項:僅用于授權測試,避免非法使用。 目錄 ?一、基礎命令 ?二、數據庫信息獲取 ?三、繞過 WAF/IDS ?四、文件系統與系統命令 ?五、高級功能與優化 ?六、實戰示例 ?一、基礎命令 ?檢測注入點 sqlmap -u "http://target.com/index.php?id1&…

Unity光線傳播體積(LPV)技術實現詳解

一、LPV技術概述 光線傳播體積(Light Propagation Volumes)是一種實時全局光照技術,通過將場景中的間接光信息存儲在3D網格中,實現動態物體的間接光照效果。 核心優勢: 實時性能:相比傳統光照貼圖,支持動態場景 硬件…

SpringBoot (一) 自動配置原理

目錄 一 自動配置 1:數據源的手動配置 1:SpringBoot的自動配置 二 自動配置的完整流程:(底層) 1. 場景化依賴與Starter機制 2. 主程序入口與注解驅動 3. 自動配置類的加載與篩選 4. 自動配置類的實現邏輯 5. 自動配置的觸發與執行流…

OJ題:移動零

雙指針法 c 語言實現 void moveZeroes(int* nums, int numsSize) {int dest,cur; //創建臨時指針和目標指針destcur0;//出初始化while(cur<numsSize)//遍歷{if(nums[cur]!0){swap(&nums[cur],&nums[dest]);cur;dest;}else{cur;}}} 思路是建立兩個指針&#xff0…

pycharm終端操作遠程服務器

pycharm項目已經連接了遠程服務器&#xff0c;但是打開終端&#xff0c;卻依舊顯示的是本地的那個環境&#xff0c;也就是說沒有操作遠程的那個環境。只能再使用Xshell去操作遠程環境&#xff0c;很麻煩&#xff0c;找了下教程。 來源&#xff1a;https://blog.csdn.net/maolim…

(頭歌作業—python)3.2 個人所得稅計算器(project)

第1關&#xff1a;個人所得稅計算器 任務描述 本關任務&#xff1a;編寫一個個人所得稅計算器的小程序。 相關知識 個人所得稅繳納標準 2018 年 10 月 1 日以前&#xff0c;個稅免征額為 3500 元/月&#xff0c;調整后&#xff0c;個稅免征額為 5000 元/月&#xff0c; 7 級超…

Redis場景問題1:緩存穿透

Redis 緩存穿透是指在緩存系統&#xff08;如 Redis&#xff09;中&#xff0c;當客戶端請求的數據既不在緩存中&#xff0c;也不在數據庫中時&#xff0c;每次請求都會直接穿透緩存訪問數據庫&#xff0c;從而給數據庫帶來巨大壓力&#xff0c;甚至可能導致數據庫崩潰。下面為…

CUDA Memory Fence 函數的功能與硬件實現細節

CUDA Memory Fence 函數的功能與硬件實現細節 Memory Fence 的基本功能 CUDA中的memory fence函數用于控制內存操作的可見性順序&#xff0c;確保在fence之前的內存操作對特定范圍內的線程可見。主要功能包括&#xff1a; 排序內存操作&#xff1a;確保fence之前的內存操作在…

實戰篇Redis

黑馬程序員的Redis的筆記&#xff08;后面補一下圖片&#xff09; 【黑馬程序員Redis入門到實戰教程&#xff0c;深度透析redis底層原理redis分布式鎖企業解決方案黑馬點評實戰項目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…

Reactive編程:什么是Reactive編程?Reactive編程思想

文章目錄 **1. Reactive編程概述****1.1 什么是Reactive編程&#xff1f;****1.1.1 Reactive編程的定義****1.1.2 Reactive編程的歷史****1.1.3 Reactive編程的應用場景****1.1.4 Reactive編程的優勢** **1.2 Reactive編程的核心思想****1.2.1 響應式&#xff08;Reactive&…

異步轉同步,實現一個消息隊列

有一個場景&#xff0c;需要實現一個消息隊列&#xff0c;要求 1&#xff0c;3&#xff0c;4 秒后&#xff0c;依次打印 1&#xff0c;2&#xff0c;3&#xff0c;如下&#xff1a; 其實考察的是怎么用同步的方式實現異步。 本文總結了四種方式實現&#xff1a;常規嵌套、prom…

【Spring Boot 與 Spring Cloud 深度 Mape 之十】體系整合、部署運維與進階展望

【Spring Boot 與 Spring Cloud 深度 Mape 之十】體系整合、部署運維與進階展望 #微服務實戰 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事務 #Seata #ServiceMesh #總結 #SpringCloud #SpringBoot 系列終章&#xff1a;經過前九篇 [【深度 Mape 系列】] 的系統學習…

求職筆試題

PDD 最長公共子序列 1143-最長公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二維動態規劃"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 這種寫法錯誤&#xff0c;m1行…

【MySQL基礎-16】MySQL DELETE語句:深入理解與應用實踐

1. DELETE語句基礎&#xff1a;數據刪除的藝術 在數據庫管理中&#xff0c;DELETE語句是維護數據完整性和清理過期信息的關鍵工具。與日常生活中的"刪除"不同&#xff0c;數據庫中的刪除操作需要更加謹慎和精確&#xff0c;因為數據一旦刪除&#xff0c;恢復可能非常…

python學習筆記(3)——元組

Python3 元組全面詳解 一、元組的定義與特性 基本概念 元組(Tuple)是Python中的不可變序列,用小括號()表示,元素用逗號分隔。與列表不同,元組一旦創建,元素不能修改、添加或刪除(元素本身為可變對象的情況除外)。 不可變性 ? 元組的每個元素的引用不可變,但若元素是可…

Android 中實現一個自定義的 AES 算法

版權歸作者所有&#xff0c;如有轉發&#xff0c;請注明文章出處&#xff1a;https://cyrus-studio.github.io/blog/ 前言 AES&#xff08;Advanced Encryption Standard&#xff0c;高級加密標準&#xff09; 是一種 對稱加密算法&#xff0c;用于加密和解密數據。AES 由 美國…

小河:團隊金牌精準計劃

【趨勢識別與預測】 數據趨勢分析在隨機序列研究中首要價值在于識別潛在規律并提升預測能力。隨機序列常表現為無規則波動&#xff0c;但通過滑動平均、指數平滑、小波變換等方法&#xff0c;可剝離噪聲干擾&#xff0c;提取長期趨勢或周期性成分。例如&#xff0c;在金融時間序…