python中[[]] * (n)和[[] for _ in range(n)]的區(qū)別詳解
1、現(xiàn)象
刷leetcode207的時候碰到一個坑,用[[]] * (n)初始化二維數(shù)組,邏輯是正確的,但是結(jié)果始終不對。
2、原因
最后定位是初始化語句使用錯誤導(dǎo)致的,我使用的是[[]] * (n),應(yīng)該使用[[] for _ in range(n)]
3、解釋
[[]] * (n)和[[] for _ in range(n)]打印結(jié)果完全一樣,但是原理卻不一樣
[[]] * (n)表示復(fù)制子列表( 此處為[] ) n次,這些子列表指向或引用相同的對象,也就是內(nèi)存地址一樣,因此修改其中一個子列表元素,會同時影響其他子列表的值,如下面代碼中的L1
[[] for _ in range(n)] 表示列表的子列表元素是每次for循環(huán)創(chuàng)建的新對象,這些子列表指向或引用不同的對象,內(nèi)存地址當(dāng)然也不一樣,因此修改其中一個子列表元素,不會影響其他子列表的值,如下面代碼中的L2
n = 2 L1 = [[]] * n L2 = [[] for _ in range(n)] print(f'L1:{L1}, L2:{L2}') print(L2 == L2) #值相等 print(id(L1[0]),id(L1[1])) # L1列表內(nèi)的元素,地址相同 print(id(L2[0]),id(L2[1])) # L2列表內(nèi)的元素,地址不同 L1[0].append(1) L2[0].append(1) print(f'L1:{L1}, L2:{L2}')
打印結(jié)果:
4、注意
L1 中的元素是列表,是可變對象,使用*n復(fù)制,不同元素才會指向同一個對象,但是如果L1中元素是不可變對象,比如int、string、float、tuple,使用*n復(fù)制的時候,不同元素也會指向同一個元素,但是修改時,由于是不可變對象,修改時會重新開辟一塊內(nèi)存,變量指向新地址,這樣修改其中一個元素,不會影響其他元素
i = 2 L1 = [2] * i # 列表元素為不可變對象 int print(L1) print(id(L1[0]),id(L1[1])) L1[0] = 4 print(id(L1[0]),id(L1[1])) print(L1)
打印結(jié)果為
5、其他
可變數(shù)據(jù)類型:列表list[ ]、字典dict{ }
不可變數(shù)據(jù)類型:整型int、字符串str' '、元組tuple()浮點數(shù)float
到此這篇關(guān)于python中[[]] * (n)和[[] for _ in range(n)]的區(qū)別詳解的文章就介紹到這了,更多相關(guān)python [[]] * (n)和[[] for _ in range(n)]內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用django實現(xiàn)一個代碼發(fā)布系統(tǒng)
這篇文章主要介紹了使用django實現(xiàn)一個代碼發(fā)布系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07springboot aop方式實現(xiàn)接口入?yún)⑿r灥氖纠a
在實際開發(fā)項目中,我們常常需要對接口入?yún)⑦M(jìn)行校驗,本文主要介紹了springboot aop方式實現(xiàn)接口入?yún)⑿r灥氖纠a,具有一定的參考價值,感興趣的可以了解一下2023-08-08Django 忘記管理員或忘記管理員密碼 重設(shè)登錄密碼的方法
今天小編就為大家分享一篇Django 忘記管理員或忘記管理員密碼 重設(shè)登錄密碼的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05