Python(2)—List、Set、Tuple、Dictionary之間的區別、參數傳遞


1、list 列表

  有序集合,隨時增刪。包含的數據類型可以不同:整數、浮點數、字符串、list、tuple、dict、set、bool、空值、常量。

  list = [12, 'Yummy', 19.2, [1, 3, 'zhan']]

  • list名為列表,相當於一個數組

  • list列表是有序的,其中的每個元素都分配一個位置索引,索引值從0開始

  • list的長度是自動變化的

  • list列表元素不必都是同一種類型

  • list列表可以進行截取、組合、修改、增加等操作

  • list列表中的元素用中括號[]來表示

 

  函數:len()、append()、remove()移除列表中某個值的第一個匹配項、insert()、pop()、sort()、del、list()、reverse()、index()從列表中找出某個值第一個匹配項的索引位置、count()統計某個元素在列表中出現的次數、extend()在列表末尾一次性追加另一個序列中的多個值(用新列表擴展原來的列表)。

  刪除:del list1[0]

  元祖轉換為列表:tuple-->list  list(tuple)

  append(value)把元素添加到末尾、insert(i,value)把元素添加到任意位置;pop()刪除末尾元素、pop(i)刪除指定位置的元素、remove(value)直接刪除某個元素值;list1.sort()對元素進行排序

  取值:list1[0]、list1[4:]、list1[:-4]、list1[2:-3],嵌套:list里面可以嵌套list從而形成類似於二維、三維、多維數組的。

2、tuple 元組

  tuple = (3.14,'yu',[3,1,2])

   tuple[1] = 'a'

  python內置的數據類型,有序列表,一旦初始化,無法修改。tuple不可變,所以代碼更安全。可以看做是一種“不變”的List,即tuple一旦創建完畢,就不能修改了。

  Tuple元組中的元素用小括號()來表示。

3、dict 詞典  

  d={'Michael': 95, 'Bob': 75, 'Tracy': 85}

  鍵值對(key-value)方式存儲,查找速度快;dict的key必須是不可變對象(字符串、數字、元祖);相當於一個HashMap。

  • Dictionary字典查找速度快,但是代價是耗費的內存大。List相反,占用內存小,但是查找速度慢。這就好比是數組和鏈表的區別

  • Dictionary字典沒有順序,而List是有序的集合,所以不能用Dict來存儲有序集合

  • Dictionary字典的Key不可變,Value可變。一旦一個鍵值對加入dict后,它對應的key就不能再變了,但是Value是可以變化的

  • Dictionary字典中的Key不可重復

  • Dictionary字典中的元素用中花括號{}來表示

4、set 無序集合、key不重復

  set = set(['A','B','C','B','C'])

  要創建一個set,需要提供一個list作為輸入集合。

  無索引、無切片、作為一個無序的集合,set不記錄元素位置或者插入點。因此,set不支持 indexing, slicing, 或其它類序列(sequence-like)的操作

  set和dict類似,也是一組key的集合,但不存儲value。由於key不能重復,所以,在set中,沒有重復的key。

  • set就像是把Dict中的key抽出來了一樣,類似於一個List,但是內容又不能重復

  • set集合是無序的

  • set集合通過調用set()方法創建

5、總結:

  •      1、list、tuple是有序列表;dict、set是無序列表
  •      2、list元素可變、tuple元素不可變
  •      3、dict和set的key值不可變,唯一性
  •      4、set只有key沒有value
  •      5、set的用途:去重、並集、交集等
  •      6、list、tuple:+、*、索引、切片、檢查成員等
  •      7、dict查詢效率高,但是消耗內存多;list、tuple查詢效率低、但是消耗內存少

6、Python 的參數傳遞

  1. 對於不可變對象作為函數參數,相當於C系語言的值傳遞; 
  2. 對於可變對象作為函數參數,相當於C系語言的引用傳遞。 

  tuple,number等為不可變對象,list等對象是可變對象。但是這樣理解從結果上理解是正確的,從原理上說,前面已經說過了,python一切對象傳遞的都是地址,不同的是,在函數內部轉換的過程不一樣。 

代碼解釋: 
  在程序內部,test_list的地址和test_number的地址都傳遞都函數test中去。 
  執行.pop()操作的時候,是在原地址上進行操作,因此會改變原來的值。 
  執行+1操作的時候,test_number + 1 = 2,開辟了一段內部地址指向了2,局部地址(局部對象)指向了這個新對象2,原來的test_number並沒有改變,因此原來的test_number並不會改變。 
  同理:如果將test_list.pop()改成 test_list = [1],那么原來的test_list的地址也不會改變,即print test_lists仍然會打印出 [1,2,3]。

def test(test_list, test_number):
    test_list.pop()
    test_number = test_number + 1

# 參數分別為list類型和number類型, 也就是一個是可變對象,一個是不可變對象
test_list = [1, 2, 3]
test_number = 1

test(test_list, test_number)

print test_list  # 輸出[1, 2]
print test_number  # 輸出[1]

 

舉例說明:

show me the code

def bad_append(new_item, a_list=[]):
    a_list.append(new_item)
    return a_list

  這段代碼是初學者最容易犯的錯誤,用可變(mutable)對象作為參數的默認值。函數定義好之后,默認參數 a_list 就會指向(綁定)到一個空列表對象,每次調用函數時,都是對同一個對象進行 append 操作。因此這樣寫就會有潛在的bug,同樣的調用方式返回了不一樣的結果。

>>> print bad_append('one')
['one']
>>> print bad_append('one')
['one', 'one']

  而正確的方式是,把參數默認值指定為None,指定一個新的地址,保存變量

def good_append(new_item, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM