網(wǎng)站首頁 編程語言 正文
類成員變量默認初始值的坑
問題發(fā)現(xiàn)
一個循環(huán)內(nèi),缺省值初始化同名變量,其中的list成員不是空,會延續(xù)之前同名變量的值。
示例代碼
# Define class class Variant(): ?? ?# use ?? ?def __init__(self, price = 500, description = 'default description', values = ['', '', '']): ?? ??? ?self.price = price ?? ??? ?self.description = description ?? ??? ?self.values = values ?? ? ?? ?def __str__(self): ?? ??? ?return 'price: {}, description: {}, values: {}'.format(self.price, self.description, self.values) variant_list = [] # Create instance with same name iteratively for i in range(3): ?? ?current_variant = Variant() ?? ?if i == 1: ?? ??? ?current_variant.values[2] = 'hello' ?? ?current_variant.price = i ?? ?current_variant.description = 'description of variant: {}'.format(i) ?? ?variant_list.append(current_variant) ?? ? # Test results for variant in variant_list: ?? ?print(str(variant))
結(jié)果
所有實例的values列表值相同
原因
可選參數(shù)默認值的設置在Python中只會被執(zhí)行一次,也就是定義該函數(shù)的時候”如此使用缺省值初始化,list成員指向的是同一個list(地址),如果只是修改其中一個元素(而不是賦值新的list開辟新內(nèi)存),那么所有instance的list成員都會被修改。
解決方法
直接在構(gòu)造方法中置為空(self.values = ['', '', '']),之后各個修改值
Python默認值參數(shù)
簡單粗暴上代碼
def fun(a, b=[]): ? ? b += [a] ? ? print(b) fun(1) fun(2,[]) fun(3)
是不是看上去很簡單,其實暗藏玄機,請大家看一下輸出結(jié)果,是不是有點讓你疑惑^^~
[1]
[2]
[1, 3]
此時你是否也和我有一樣的疑惑,為什么 fun(3) 的輸出結(jié)果是 [1, 3]?
哈哈,不賣關子了,這里是因為,因為函數(shù)被定義好后,只會生成一次,所以在函數(shù)生成的時候定義的變量 b 的默認值也只會被初始化一次。
因此,當執(zhí)行fun(1)函數(shù)時,沒有給 b 傳參,所以使用的是 b 的默認值,此時 b 的默認值為[1]。
執(zhí)行fun(2,[])時,給 b 傳了一個[]值(恰好和默認值相同,其實是不同的數(shù)據(jù)),因此便使用的是傳入數(shù)據(jù),執(zhí)行結(jié)果便是[2]。
然后在執(zhí)行fun(3),此刻又沒有給 b 傳參,所以依舊使用的是 b 的默認值, 而 b 的默認值只會隨著函數(shù)的生成被生成一次 ( fun(1) 生成過了 ),所以現(xiàn)在的默認值是fun(1)的執(zhí)行結(jié)果[1],因此當fun(3)再次調(diào)用時,輸出結(jié)果便會是[1, 3]。
如果不行出現(xiàn)當前這種情況,而是在函數(shù)每次被調(diào)用的時候都初始化一次變量
可以用下面這種寫法
def function(a, b=None): ? ? b = b if b else [] ?# 明確每次重新定義b ? ? b += [a] ? ? print(b) function(1) function(2, []) function(3)
輸出結(jié)果:
[1]
[2]
[3]
原文鏈接:https://blog.51cto.com/u_8878683/2348528
相關推薦
- 2022-06-30 C語言詳細圖解浮點型數(shù)據(jù)的存儲實現(xiàn)_C 語言
- 2023-07-27 express 請求方式(常用) / 不完整請求路徑
- 2022-10-18 react電商商品列表的實現(xiàn)流程詳解_React
- 2022-07-14 C++深入淺出講解希爾排序算法的實現(xiàn)_C 語言
- 2022-11-21 Python?tabulate結(jié)合loguru打印出美觀方便的日志記錄_python
- 2022-10-12 Nginx?504?Gateway?Time-out的兩種最新解決方案_nginx
- 2022-07-01 詳解go?mod?使用方法_Golang
- 2022-02-28 ERROR in Entry module not found: Error: Can't reso
- 最近更新
-
- 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同步修改后的遠程分支