不可變類型與可變類型:澄清概念
使用程式語言時,理解不可變類型和可變類型之間的區別至關重要。查詢中提供的範例提出了有關此概念的問題。
什麼構成不可變型?
不可變型別是指其值一旦建立就無法修改的物件。浮點物件通常被認為是不可變的,如範例所示:
class RoundFloat(float): def __new__(cls, val): return float.__new__(cls, round(val, 2))
此範例定義了一個擴展浮點類型的類別。但是,new 方法不會修改物件建立期間建立的底層浮點值。類似地,範例:
class SortedKeyDict(dict): def __new__(cls, val): return dict.__new__(cls, val.clear())
建立一個擴展 dict 類型的類,其中 new 在建立時從字典中刪除所有鍵。 RoundFloat 和 SortedKeyDict 都展示了不變性,因為它們的 new 方法不會更改原始值。
可變類型:就地修改
相反,可變類型允許就地修改值。範例:
class SortedKeyDict_a(dict): def example(self): return self.keys()
定義一個類,該類使用返回鍵列表的範例方法擴展 dict 類型。然而,字典仍然是可變的,如下所示:
d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2)) SortedKeyDict_a(d) # Returns a dictionary without calling example
可變性:值分配與就地修改
不可變類型的行為可能會令人困惑,特別是在考慮時賦值:
x = 5.0 x += 7.0 print x # 12.0
在此範例中,x 是一個浮點對象,它是不可變的。然而,賦值 x = 7.0 似乎改變了它的值。這裡的關鍵差異在於 x 的原始浮點值被分配了一個新值,而不是就地修改。
這種區別也適用於可變類型。考慮以下範例:
s = 'foo' s += 'bar' print s # foobar
由於 s 是字串類型(不可變),因此必須重新指派它以包含「bar」。可以使用可變類型進行就地修改:
x = [1, 2, 3] x += [3, 2, 1] print x # [1, 2, 3, 3, 2, 1]
這裡,列表 x 透過附加另一個列表來擴展。這些範例強調了類型的可變性與就地修改功能有關。
以上是不可變類型與可變類型:何時賦值意味著就地修改?的詳細內容。更多資訊請關注PHP中文網其他相關文章!