1.場景
有一天全跨,同事問我:“我在動態(tài)改變一個list值的時候總是不遂人愿闷袒,你幫我看看是哪里出了問題卸伞?”
她的代碼是這么寫的:
#fromTongshi.py
#2020.06.07
language = ["Python",0]
scores = [75,80,90]
result = []
for score in scores:
language[-1] = score
result.append(language)
print(result)
她想象的結(jié)果是這樣的:
[['Python', 75], ['Python', 80], ['Python', 90]]
而實際上結(jié)果是這樣的:
[['Python', 90], ['Python', 90], ['Python', 90]]
問題出在哪里呢速缨?
2.值和引用
在Python里褒翰,數(shù)據(jù)類型分為2種欲间,可變類型和不可變類型楚里。
可變類型:字典(dict), 集合(set), 列表(list)
不可變類型:整型(int), 字符串(string), 浮點型(float), 元組(tuple)
可變類型的對象在被調(diào)用時傳遞的是該對象的值。
不可變類型的對象在被調(diào)用時傳遞的是該對象的位于內(nèi)存中的數(shù)據(jù)的引用猎贴。
來解釋一下同事的難題:
language
是一個可變類型的對象班缎。在result.append(language)
以后,language
將它的引用傳遞給了result
她渴,
在第1次append
以后达址,result
有了1個language
的引用,此時result=[language的引用]
趁耗,而此時language
的引用指向的數(shù)據(jù)是['Python', 75]
沉唠。
在第2次append
以后,result
有了2個language
的引用苛败,此時result=[language的引用, language的引用]
满葛,而此時language
的引用指向的數(shù)據(jù)是['Python', 80]
。
在第3次append
以后著拭,result
有了3個language
的引用纱扭,此時result=[language的引用, language的引用,language的引用]
儡遮,而此時language
的引用指向的數(shù)據(jù)是['Python', 90]
乳蛾。
3.曲線救國
如果真的想實現(xiàn)這個功能應(yīng)該怎么做呢?
我們可以利用一個中間變量,來保證每次循環(huán)時都重新生成這個變量肃叶。
如:
language = ["Python",0]
scores = [75,80,90]
result = []
for score in scores:
temp = language[:-1]
temp.append(score)
result.append(temp)
print(result)