2014-01-08 107 views
0

爲什麼在私有類變量中的這種結構會將其數據附加到先前的實例?Python 3 - 追加到私有EMPTY列表

class garden: 
    __flower = [] 

    def __init__(self, flower): 
     self.__flower.append(flower) 

    def __str__(self): 
     return str(self.__flower) 


g1 = garden([1,2,3,4]) 
print(g1) 
g2 = garden([5,6,7,8]) 
print(g1) 

輸出:

[[1, 2, 3, 4]] 
[[1, 2, 3, 4], [5, 6, 7, 8]] 

比較的 「字符串行爲」 看起來真的不同勢,我 - 爲什麼這個:

class garden: 
    __flower = "" 

    def __init__(self, flower): 
     self.__flower = flower 

    def __str__(self): 
     return str(self.__flower) 


g1 = garden("dsf") 
print(g1) 

g2 = garden("asdf") 
print(g2) 
print(g1)enter code here 

輸出:

dsf 
asdf 
dsf 

感謝回答

回答

4

因爲在class聲明的變量任何def類屬性,由該類的所有實例共享。

class Garden(object): 

    class_flower_attribute = [] 

    def __init__(self, flower): 
     self.instance_flower_attribute = [flower] 
+0

不'class_flower_attribute'將要面對的同樣問題[如這裏所描述](http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#default-parameter - 值) –

+0

Jop,那是我搜索:-) Thx – binzram

+0

@DaanTimmer不,它是一個類屬性不是一個可變的默認參數值。後者通常是意外事故,前者通常是故意的! – jonrsharpe