正如所有其他答案指出的那樣,a_list
是一個類屬性,在所有實例之間共享。
但a_number
是也一個類屬性,在所有實例之間共享。那麼,爲什麼這是不同的?
正因爲如此:
a.a_number = 555
即分配創建一個實例在實例a
,隱藏類屬性屬性a_number
。如果用列表做同樣的事情,你會得到同樣的效果:
>>> b.a_list = [1,2,3]
>>> b2.a_list
[1,2]
但是,這不是你做了什麼。相反,你變異列表到位:
b.a_list[1] = 666
這是一個分配給b.a_list[1]
,但它不是一個分配b.a_list
。因此,它不會在b
對象中創建實例屬性。
如果您可以就地變異a.a_number
,它也會出現在a2.a_number
。由於數字不可變,因此無法直接看到。但你可以通過比較a.a_number is a2.a_number
或查看他們的id
s間接看到它間接 s-雖然這不是一個完美的測試,因爲a.a_number, a2.a_number = 5, 5
或甚至a.a_number, a2.a_number = 2+3, 6-1
仍然可以給你相同的對象,而不是因爲它們仍然在使用類屬性,但是因爲它們現在都具有它們自己的實例屬性,兩者都引用相同的數字5
對象。 *
*語言允許實現重用時,它知道價值是不可變的同一個對象。實際上,現有的主要實現方法是針對小整數,特殊的單例常量True
,False
和None
,以及可能只有幾個字符串。使用(默認配置的)CPython,555
和666
不被視爲小整數,但是5
是。
在第一個例子中,它們也包含相同的'a_number'。只是在第一個例子中,你給了其中一個新的'a_number',但在第二個例子中,你並沒有給出一個新的'a_list'。 – user2357112
順便說一句,如果你在Python 2中,你的類應該從'object'繼承。閱讀:http://stackoverflow.com/questions/4015417/python-class-inherits-object –