-
國慶連假打python的時候,本來以為是自己邏輯上出錯的bug,後來發現好像跟python本身的運作比較有關,但我不知道怎麼會這樣所以上來尋求一下幫助,內容如下 先寫一個叫ObjWithSet的class,裡面裝著1個set
用for loop跑一下,創造3個物件
執行結果:
我們可以看到,三個物件都在同一個位址上,這沒問題,因為他們都是局部變數而已 要命的是,要是用一個list來裝for loop裡所創建的物體...
執行結果:
雖然看似創造出了3個不同物件,但裡面的set是共用同一個,debug的時候差點哭出來 如果先在建構子裡面用
一樣創3個物件,最後查看第一個物件裡的set
執行結果:
因為這三個物件裡的set是同一個,所以之前的var3.s果然還是被改掉了 那該如何讓每個物件裡的set都是獨一無二的呢? 把建構子寫成這樣,直接賦值而不用
一樣創3個物件
執行結果:
可喜可賀,終於3個物件有著一個獨立的set了 但我想問的是,為什麼建構子用第一種寫法不行,第二種就可以呢??
|
Beta Was this translation helpful? Give feedback.
Replies: 3 comments
-
你的宣告方式錯誤了 class test:
def __init__(self, idx):
self.s = set()
self.s.add(idx)
for i in range(3):
tmp = test(i)
print(id(tmp), id(tmp.s), tmp.s) |
Beta Was this translation helpful? Give feedback.
-
大哥(或大姊),你所宣告的 set 為 class variable 而非 instance variable,當然所有物件會共用同一個 s 的實例。如果你想要每個人都不一樣,請加
|
Beta Was this translation helpful? Give feedback.
-
原來如此! 感謝各位! |
Beta Was this translation helpful? Give feedback.
你的宣告方式錯誤了
要把set宣告在init內才會是屬於instance的元素,你的寫法會變成屬於class的元素所以不同instance之間會是同一個。