python天坑------可變對象
阿新 • • 發佈:2018-10-25
字符串 print 修改 字體 set 並且 spa 字體加粗 獨立
我們知道,python中對象是分為可變和不可變的,
不可變對象比如字符串、數字、元組。對不可變對象的修改,python會在內存中開辟新的空間,來存儲這個新的對象,
也就是,修改後的對象和原對象在內存中是互相獨立的兩塊空間,
可變對象比如,list、dict、set。可變對象本質是一個容器,對可變對象的修改,也就是修改容器中的元素,
python不會開辟新的空間,也就是,內存中始終只存在一個容器
問題主要出在可變對象上,下面以list為例說明
a=[] if len(a): b=a.pop() else: b=[] b.append(8) #b=[8] a.append(b)#a=[[8]],或者a=[b] a.append(b) #a=[[8],[8]],或者a=[b,b] print(‘a:‘,a) print(‘b:‘,b) if len(a): b=a.pop() #b=[8] #a=[[8]],或者a=[b] else: b=[] b.append(8) #b=[8,8] #a=[b],所以a=[[8,8]] a.append(b) #a=[b,b],所以a=[[8,8],[8,8]] print(‘a:‘,a) print(‘b:‘,b) 輸出: a: [[8], [8]] b: [8] a: [[8, 8], [8, 8]] b: [8, 8]
由於a中的元素是b,
而b是個容器,裏面的元素是可變的,
當b中的元素變化的時候,a也會跟著變,如上述字體加粗部分
總結:
如果需要保存可變對象,並且該可變對象一直在變化時,需要保存其深拷貝對象,切記!
python天坑------可變對象