網(wǎng)站首頁 編程語言 正文
列表是一種經(jīng)常使用的數(shù)據(jù)類型。在函數(shù)的定義中,常常會使用列表作為參數(shù)。
比如,要測試一個接口的數(shù)據(jù),接口返回的數(shù)據(jù)格式如下:
{
"code": "20000",
"data": ["孫悟空","李白","甄姬"],
"msg": "success",
"status": 0
}
要測試的內(nèi)容是:返回的 data 數(shù)據(jù)是否跟需求符合。在測試之前,需要對數(shù)據(jù)進一步處理,比如要增加 “王昭君” 這個元素進去,需要寫一個函數(shù):
def add_element(data=["孫悟空","李白","甄姬"]):
data.append('王昭君')
return data
print(add_element())
print(add_element())
print(add_element())
在函數(shù)定義的時候經(jīng)常會給參數(shù)設置默認值,在這個例子中,將 data 參數(shù)設置了默認值,函數(shù)定義以后,后面會被頻繁的調(diào)用,期望值應該是打印如下:
["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君"]
實際結(jié)果為:
["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君","王昭君"]
["孫悟空","李白","甄姬","王昭君","王昭君","王昭君"]
原因
當定義函數(shù)時,會保存函數(shù)中默認參數(shù) data 的值,也就是 ["孫悟空","李白","甄姬"]
,在每次調(diào)用的時候如果傳遞了新的實參,則使用傳遞的參數(shù);沒有傳遞,使用定義函數(shù)時保存的默認參數(shù)。
上面兩次調(diào)用中,都沒有傳遞新的實參,程序會調(diào)用定義函數(shù)時保存的默認參數(shù),因為 append() , 在第一次調(diào)用以后,默認參數(shù)已經(jīng)由 ["孫悟空","李白","甄姬"]
改變?yōu)?["孫悟空","李白","甄姬","王昭君"]
,再次執(zhí)行 append() 之后,就變成了 ["孫悟空","李白","甄姬","王昭君","王昭君"]
;同理,第三次又改變了。
可以使用 id() 函數(shù)來定位問題:
def add_element(data=["孫悟空","李白","甄姬"]):
# id 來表示是不是同一個對象
print(id(data))
data.append('王昭君')
return data
print(add_element())
print(add_element())
print(add_element())
打印出來的 id(data)
為同一個對象,也就是默認參數(shù)。如果我們改變 第二個 print(add_element())
為 print(add_element(["孫悟空","李白","甄姬"]))
,那么第 2 個 id(data)
就會發(fā)生變化,因為它不在是默認值,而是新傳進來的實參,實際結(jié)果也將變成:
2543416926792
['孫悟空', '李白', '甄姬', '王昭君']
2543418907848
["孫悟空","李白","甄姬", '王昭君']
2543416926792
['孫悟空', '李白', '甄姬', '王昭君', '王昭君']
改進方案
- 如果參數(shù)中有列表,盡量不要用它做默認參數(shù)
- 如果使用了列表作為默認參數(shù),函數(shù)調(diào)用時傳入實參,而不是省略
- 可以在函數(shù)體中另外定義一個變量接收默認參數(shù)
def add_element(data=["孫悟空","李白","甄姬"]):
if data == ["孫悟空","李白","甄姬"]:
data = ["孫悟空","李白","甄姬"]
data.append('王昭君')
return data
我是九柄,公眾號【 九柄 】,分享軟件測試文章、面試、教程資料,歡迎來看看。
原文鏈接:https://blog.csdn.net/looker53/article/details/125896673
相關(guān)推薦
- 2022-03-25 Mybatis聯(lián)合查詢的實現(xiàn)方法(多表聯(lián)合查詢)
- 2023-10-15 [element-ui] el-input 不能正常輸入,輸入了也不能刪除的問題
- 2022-04-22 docker拉取常用開發(fā)工具
- 2023-01-31 MongoDB?入門指南_MongoDB
- 2022-09-09 C#表達式和運算符詳細解析_C#教程
- 2022-11-07 SwiftUI?引導頁界面實現(xiàn)示例_Swift
- 2022-06-30 PyTorch實現(xiàn)卷積神經(jīng)網(wǎng)絡的搭建詳解_python
- 2022-09-16 利用Python第三方庫xlwt寫入數(shù)據(jù)到Excel工作表實例代碼_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支