首頁 >後端開發 >Python教學 >不可變類型與可變類型:何時賦值意味著就地修改?

不可變類型與可變類型:何時賦值意味著就地修改?

DDD
DDD原創
2024-12-16 16:54:11455瀏覽

Immutable vs. Mutable Types: When Does Value Assignment Mean In-Place Modification?

不可變類型與可變類型:澄清概念

使用程式語言時,理解不可變類型和可變類型之間的區別至關重要。查詢中提供的範例提出了有關此概念的問題。

什麼構成不可變型?
不可變型別是指其值一旦建立就無法修改的物件。浮點物件通常被認為是不可變的,如範例所示:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn