1. 程式人生 > >python 列表總結二

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