推 qqttpp:大感激 說的很詳細QQ 所以說大多時候就該用deepcopy囉 07/06 15:06
※ 引述《qqttpp (ㄎ一歐)》之銘言:
: 最近發現我要
: from xxx import ooo
: aaa=ooo
: aaa.sss()...............(1)
: bbb=ooo
: bbb.sss()
: 這樣卻會發現我對aaa的總總行為(1)都會被bbb給繼承
: 或是說他根本直接就是對ooo作
: 我後來把所有的東西都放到def __init__()裡面
: 表面上似乎是就沒有殘留了
: 但是根本上還是會有問題
: 尤其是我用到threads的時候
: 有沒有辦法不要讓我對aaa的行為不會去影響ooo
: 例如dictionary似乎也是有這樣的現象
: a={1:1,2:2}
: b=a
寫b=a的話,b和a會refer到同一個物件
如果要複製一份a的話
import copy
b=copy.copy(a)
再改變b就不會動到a了
可以參考 http://docs.python.org/lib/module-copy.html
順便比較一下copy.copy和copy.deepcopy的不同:
a=[[1,2,3],['a','b','c']]
b=copy.copy(a)
這樣 b和a是不同物件
但b[0]和a[0]是同一個物件,b[1]、a[1]也是同一個物件
(也就是shallow copy只copy a的最外層,裏面的東西還是同一個)
要看效果的話,可以試試:
a[0]=a[0]+[4]
a[1].append('d')
print a
print b
比較一下a和b應該就能了解了
用deep copy的話就完全不用擔心a,b會互相影響的問題
不過要注意recursion limit
這個問題和「繼承」似乎沒有關係?
: b[1]=3
: 結果a={1:3,2:2}
: ....我只想要改變b不想改變a阿.....
: 請問是不是有什麼地方是我忽略的
: 謝謝囉~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.57.64.211
※ 編輯: mantour 來自: 61.57.64.211 (07/04 16:08)