基礎資料補充
阿新 • • 發佈:2019-01-04
列表不能迴圈新增 會變成死迴圈
列表使用for迴圈刪除元素 for迴圈機制會導致有些操作刪不乾淨:
li = [1,2,3,4,5] for i in li: li.remove(i) print(li) 結果: [2,4] #remove在刪除的時候,後邊的數字會補位到前一位,導致刪除不乾淨
li = [1,2,3,4,5] for i in li: li.pop() print(li) 結果: [1, 2] #迴圈到3的時候,後邊的元素已經刪除了,沒有辦法繼續迴圈
列舉幾種可以實現清空列表的方法:
li = [1,2,3,4,5] fori in range(len(li)): li.pop() print(li) 結果: []
li = [1,2,3,4,5] l2 = [] for i in li: l2.append(i) for j in l2: li.remove(j) print(li) 結果: [] #定義一個空列表,利用偷換概念的方法進行清空
li = [1,2,3,4,5] for i in li: li.clear() print(li) 結果: [] #clear可以很容易的清空列表
字典刪除元素 字典在for迴圈的時候 不能修改:
dic = {'1':22,'5':'22'} lst = [] for i in dic: lst.append(i) for j in lst: dic.pop(j) print(dic) 結果: {} #同樣適用偷換概念的方法
fromkeys:
結構是dict.fromkeys('可迭代物件','值')
第一個位置是可迭代物件,也就是字典的鍵
第二個位置 不寫是None 也就是字典的值
dic = dict.fromkeys('1234','你好') print(dic) dic['2'] = '明天' print(dic) dic['3'] = [5,6,7] print(dic) 結果: {'1': '你好', '2': '你好', '3': '你好', '4': '你好'} {'1': '你好', '2': '明天', '3': '你好', '4': '你好'} {'1': '你好', '2': '明天', '3': [5, 6, 7], '4': '你好'}
當fromkeys當中新增的值是可變資料型別,當改變這個可變資料型別時,所有鍵對應的值都要改變:
dic = dict.fromkeys('你好啊',[1,2,3]) print(dic) dic['你'].append(99) print(dic) 結果: {'你': [1, 2, 3], '好': [1, 2, 3], '啊': [1, 2, 3]} {'你': [1, 2, 3, 99], '好': [1, 2, 3, 99], '啊': [1, 2, 3, 99]}
深淺拷貝:
淺拷貝: 只拷貝第一層元素,元素是不可變的就不會變,元素是可變的,兩個都會變
li = [1,2,3,4] lst = li.copy() print(li) print(lst) li[0] = 6 print(li) print(lst) 結果: [1, 2, 3, 4] [1, 2, 3, 4] [6, 2, 3, 4] [1, 2, 3, 4]
#當li的元素改變是,lst不變
li = [1,2,3,4,[5,6,7]] lst = li.copy() print(li) print(lst) li[-1].append(90) print(li) print(lst) 結果: [1, 2, 3, 4, [5, 6, 7]] [1, 2, 3, 4, [5, 6, 7]] [1, 2, 3, 4, [5, 6, 7, 90]] [1, 2, 3, 4, [5, 6, 7, 90]] #列表中包含可變資料列表,當li改變時,lst也會變
深拷貝: 不可變資料型別公用,可變資料型別重新開闢空間 import copy模組:
import copy li = [1,2,3,4,[5,6,7]] lst = copy.deepcopy(li) print(li) print(lst) li[-1].append(90) print(li) print(lst) 結果: [1, 2, 3, 4, [5, 6, 7]] [1, 2, 3, 4, [5, 6, 7]] [1, 2, 3, 4, [5, 6, 7, 90]] [1, 2, 3, 4, [5, 6, 7]]