python默認參數陷阱_python默認參數陷阱

0|1陷阱?

學過函數的人一定聽說過函數的默認參數,關于函數的默認參數,請看以下的例子:

def extendList(val, lst=[]):

lst.append(val)

return lst

list1 = extendList(10)

list2 = extendList(123, [])

print('list1 = %s' % list1)

print('list2 = %s' % list2)

打印的結果是?現在,我們將代碼再添加一處,來看看最后的結果是什么:

def extendList(val, lst=[]):

lst.append(val)

return lst

list1 = extendList(10)

list2 = extendList(123, [])

list3 = extendList('a')

print('list1=%s' % list1)

print('list2=%s' % list2)

print('list3=%s' % list3)

當list1處調用函數時,10被加入了列表;list2處調用函數,123被加入到了新傳入的列表中;最后到list3調用函數,應該將‘a’繼續加入到列表中返回。因此得到的輸出應該是:

# list1 = [10]

# list2 = [233]

# list3 = ['a']

0|1陷阱!

然而,實際的打印結果變成了:

陷阱之所以稱之為陷阱,代表我們不能以普通的思維來看待它,通過查閱資料,得到以下的一句解釋:

A new list is created?once?when the function is defined, and the same list is used in each successive call.

在定義函數時,Python的默認參數會被計算一次,而不是每次調用函數時(比如Ruby)。這意味著如果你使用一個可變的默認參數并對其進行改變,那么你將會直接修改該對象,該影響將一直延續到未來關于該函數的調用(在默認參數沒有被重新賦其他值的情況下)。

眾所周知,Python變量存儲的是變量和值的引用關系,即實際變量對應一個內存地址。這意味著Python函數總是通過地址傳遞(傳遞參數)工作。調用函數時,不會將參數值復制到函數占位符。相反,我們將占位符指向變量本身。這有一個非常重要的結果:我們可以從函數內部更改變量的值。

0|1如何避開陷阱?

None通常是一個不錯的選擇:

def extendList(val, lst = None):

if not lst:

lst = []

lst.append(val)

return lst

有時您可以專門利用此陷阱來維護函數調用之間的狀態。這通常在編寫緩存函數時完成。

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

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

相關文章

python裁剪圖片并保存_python – 如何從圖像中剪切輪廓并將其保存到新文件中

大家好,這是我的第一個問題所以請保持溫和.我有一個計算機視覺領域的項目,我是新的,我會很感激一些幫助.我有一個pcb的圖像,我的(首先)任務是從背景中切斷電路板并將其保存到新文件.如果結果只是沒有灰色背景的普通pcb,那就沒問題了. 我到目前為止嘗試的是,首先使用閾值將圖像轉…

opencv如何把一個矩陣不同列分離開_學習OPEN_CV

OpenCv中文論壇精華地址http://www.opencv.org.cn/index.php/User:Ollydbg23http://sivp.sourceforge.net/(sivp)一、基礎操作1. 數據類型 數據結構了解圖像相關:cvArr cvMat IplImage數據數組的維數, 與數據的通道數 見P46 (76)2. 常見的矩陣操作熟悉3…

python文件合并_用Python 將兩個文件的內容合并成一個新的文件.

一個文件的內容是:IntroductiontoProgramming,NetworkingFundamentals,InternetworkingTechnologies,PlatformTechnologies,InformationTechnologyforUsers,ComputerForensics,Enterpr... 一個文件的內容是: Introduction to Programming, Networking Fundamentals, Internetwo…

flash代碼_Flash如何對制作文件進行優化

對FLASH進行優化分為兩方面,一方面是代碼上的優化,主要是通過優化提高FLASH性能,降低CPU占用和內存使用。另一方面是資源的優化,這方面的優化是為了減小編譯后的文件大小以及制作文件的大小,因為如果不進行相應的優化&…

潛流式濕地計算_人工濕地計算書

人工濕地計算書1、尾水提升泵房集水池基本參數集水池設計規模為30000m3/d,約折合1250m3/h,按水力停留時間HRT為0.25 h計,集水井有效容積應為312.5 m3,考慮到與污水廠原有排污管道相契合,集水設計尺寸為:LBH…

deepin系統轉為windows_windows系統下安裝深度系統deepin

前期準備DiskGenius(用來擴展分區)deepin-20-amd64.iso(深度系統鏡像文件)相關文件下載首先下載安裝時要用的工具,分別為:DiskGenius , UltraISODiskGenius是一款磁盤工具,創建系統分區。UltraISO是用來打開系統光盤鏡像文件工具。Win8/8.1/10無需下載Ul…

c3等待加載樣式 vue_Vue.js__簡易加載等待動畫

Vue.js__簡易加載等待動畫Vue實現為覽或講瑣了過自系一讀頁圍這就多網解元當維自加,加載動畫的樣式取自其他出處,侵直分調瀏器代,剛求的一學礎過功互有解小久宗點差維含數刪。將Vue屬性覽或講瑣了過自系一讀頁圍這就多網解元當維和方法復制到…

軟件開發模型_QT開發(二十三)——軟件開發流程

一、軟件開發流程簡介軟件開發流程是通過一系列步驟保證軟件產品的順利完成,是軟件產品在生命周期內的管理學。軟件開發流程的本質是軟件開發流程與具體技術無關,是開發團隊必須遵守開的規則。二、常見軟件開發流程模型常見的軟件開發流程模型包括即興模…

python循環語句for計數_Bash For循環(遞增計數)與for循環用法詳解

先來看for循環的例子&#xff1a;用Bash Shell的for循環&#xff0c;每次遞增數是500。復制代碼 代碼示例:#!/bin/bash##每次遞增的數ADD_NUM500#遞增1的話取消下行注釋&#xff0c;并相應的注釋另一句for的開頭的#for ((i1;i<29500;i))#遞增定義的數for ((i1;i<29500;i$…

python3.6.2用pyinstaller3.4報錯_OceanBase 2.2 版本體驗:用 BenchmarkSQL 跑 TPC-C

OB君&#xff1a;好消息&#xff01;「 OceanBase 2.2 版本 」正式上線官網啦&#xff01;&#xff08;點擊閱讀原文即可直接下載&#xff09;OceanBase 2.2版本是成功支撐2019年天貓雙11大促的穩定版本&#xff0c;同時也是用于TPC-C測試且榮登TPC-C性能榜首的版本。我們將在接…

hive窗口函數_Hive sql窗口函數源碼分析

在了解了窗口函數實現原理 spark、hive中窗口函數實現原理復盤 和 sparksql比hivesql優化的點(窗口函數)之后&#xff0c;今天又擼了一遍hive sql 中窗口函數的源碼實現&#xff0c;寫個筆記記錄一下。簡單來說&#xff0c;窗口查詢有兩個步驟&#xff1a;將記錄分割成多個分區…

容大打印機ip修改工具_M1芯片版Mac無法連接打印機怎么辦?

文末有優惠券在入手了M1芯片版MacBook Pro后&#xff0c;昨天我打算連接一下實驗室的打印機。這個打印機的型號是HP LaserJet Professional M1213nf MFP&#xff0c;在同一個局域網內通過搜索IP即可連接。在我的舊設備2015款MacBook Air上&#xff0c;很輕松就連接了打印機。可…

語音對講軟件_三款語音轉文字工具,語音輸入,高效轉換,準確率高

關于語音轉文字的軟件我在之前講了很多&#xff0c;有些人聽了也用了&#xff0c;效果不錯&#xff0c;有些人看了就忘了&#xff0c;主要是不知道用它干嘛&#xff0c;其實語音轉文字的軟件主要功能就是為了讓自己在寫作的時候可以減少時間&#xff0c;提高效率&#xff0c;其…

linux中如何復制文件并重命名_linux復制重命名 linux復制一個文件并重命名

linux下怎么復制一個文件到另外一個目錄并且重命名&#xff1f;使用Linux的CP命令復制一個文件&#xff0c;并指定一個新的文件名作為目標文件參數&#xff0c;實現復制文件時重命名文件的功能。例如&#xff0c;下面的命令將/root/fileaaa分配給/home目錄并將其重命名為filebb…

python程序員搞笑段子_程序員的爆笑漫畫和段子

Hi&#xff01;大家好呀&#xff01;我是你們幽默的喵哥&#xff01;每次推送&#xff0c;都是給大家推薦實用的項目或者技術&#xff0c;都比較枯燥。今天&#xff0c;喵哥就來給大家搞個有趣且幽默的。在程序員圈子中&#xff0c;我們也是有自己的職業文化的。比如&#xff0…

野火stm32呼吸燈程序_說一說STM32啟動過程

STM32上電后是怎么啟動的&#xff1f;main函數之前單片機都做了些什么&#xff1f;帶著這些疑問我們開始進入游戲。。。。。首先&#xff0c;開局一張圖&#xff0c;過程全靠編&#xff0c;如有說錯的地方望能指正啟動大致流程1- 上電啟動或者硬件復位2- 單片機從0x00地址開始執…

linuxpython升級3.5_linux升級python3.5到3.6

在ubuntu里&#xff0c;zlib叫zlib1g&#xff0c;相應的zlib-devel叫zlib1g.dev。默認的安裝源里沒有zlib1g.dev。要在packages.ubuntu.com上找。$sudo apt-get install ruby然后再裝zlib1g-dev就可以了$sudo apt-get install zlib1g-dev1. 安裝必備的軟件包centos: yum -y gro…

apache啟動失敗_請檢查相關配置.√mysql5.1已啟動._1、Apache啟動失敗,請檢查相關配置-百度經驗...

前幾天電腦系統崩潰了,后邊到服務中心重新恢復了系統,但是回來使用APMServ 5.2.6發現:1、Apache啟動失敗,請檢查相關配置。√MySQL5.1已啟動。系統的各種服務我都檢查過了,都是正常開啟的,百思不得其解,后邊在百度上搜索一篇文章有個例子照做了以后結果成功了。---------------…

職業規劃縱向橫向_收下這份《職業規劃喂飯式指南》

果不其然&#xff01;上篇文章發布后&#xff0c;我收到了被拿來舉反例的網友小哥的抗議~~~講道理&#xff0c;最后他拿到的Offer還是十分不錯的&#xff0c;從此以后我的朋友圈又多了一位第一手保真瓜主&#xff0c;他好我也好~那么本期《職業規劃喂飯式指南》來嘍&#xff01…

mysql通過集合查詢_MySQL使用集合函數進行查詢操作實例詳解

本文實例講述了MySQL使用集合函數進行查詢操作。分享給大家供大家參考&#xff0c;具體如下&#xff1a;COUNT函數SELECT COUNT(*) AS cust_num from customers;SELECT COUNT(c_email) AS email_num FROM customers;SELECT o_num, COUNT(f_id) FROM orderitems GROUP BY o_num;…