python 列表總結二
python中 list 修改 再次反思 .
最近讀書的時候,一些感悟,記錄一下. 之前有寫過有關列表中修改值的注意事項, 暫且把這個叫做 python 列表總結二
可以參考一下這個:
python修改列表問題總結
1 來看一個例子
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
l = list(range(10))
for num in l:
num *= 2
print(l)
result:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
這裡列表元素沒有發生改變.
2 來看下一個例子
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@author: Frank
@contact: [email protected]
@file: 33.py
@time: 2018/9/14 下午7:41
"""
if __name__ == '__main__':
l = [['a'], ['b'], ['c'], ['d']]
for number in l:
number*=2
print(l)
result:
[['a', 'a'], ['b', 'b'], ['c', 'c'], ['d', 'd']]
可以看出列表元素的值發生了改變.
同樣的程式碼 為啥一個 元素值發生了改變,而一個沒有呢?
參考 流暢的Python 8.4 節
Python 裡面 是 函式引數作為引用的時候,
Python 支援的 引數傳遞模式 是 共享傳引數 ,
共享傳引數的各個形式引數 獲得實參中各個 引用的副本. 也就是說 , 函式內部 的形參是實參的別名.
這種的結果是什麼呢?
函式可能 修改 作為引數的可變的物件 ,卻沒有辦法修改那些物件上的標識. (即不能把一個物件 替換成另外一個物件)簡單來說,如果是可變物件可以直接修改物件的值 ,如果是不可變物件是沒有辦法直接在原來的物件進行 修改的.
下面的例子可以說明這一點..
在解釋其環境裡面實驗一下
person_tuple = tuple(['name','frank'])
hobby_tuple =tuple(['swimming'])
person_tuple = tuple(['name','frank'])
hobby_tuple =tuple(['swimming'])
person_tuple
('name', 'frank')
hobby_tuple
('swimming',)
id(person_tuple),id(hobby_tuple)
(4458632456, 4458598864)
person_tuple+hobby_tuple
('name', 'frank', 'swimming')
person_tuple
('name', 'frank')
person_tuple+=hobby_tuple
person_tuple
('name', 'frank', 'swimming')
id(person_tuple)
4458568872
Python 中 元祖是不可變物件, 所以 在進行 += 的時候,Python 並沒有報錯,而是直接申請另一個空間來重新存 修改後的值.
可以看出 4458632456 ,和 4458568872 是不一樣的. 所以python 解釋其會計算值,之後賦給這個 person_tuple 物件,原來的person_tuple 會被釋放掉了.
這就是元祖的不可變性,就是沒有辦法在原來的tuple 新增元素.
3 在看一個流暢的Python書中的一個例子
在直譯器環境下面:
def add(x,y):
x += y
return x
x ,y =10,20
add(x,y)
30
x
10
y
20
x=[1,2]
y=['frank','chang']
add(x,y)
[1, 2, 'frank', 'chang']
x
[1, 2, 'frank', 'chang']
同樣是 x,y 但是如果 x,y 是不可變型別, x+=y 並不會改變 x 的值.
如果 x,y 是可變型別, x+=y就會 修改x 的值.
4 總結
對於用for 迭代 可迭代物件的時候,列表中是否可以修改元素取決於,列表的元素是不是可變的物件, 如果是就可以修改.
分享快樂,留住感動.2018-09-14 23:01:55 –frank