ホームページ >バックエンド開発 >Python チュートリアル >不変型と可変型: 値の割り当てがインプレース変更を意味するのはどのような場合ですか?

不変型と可変型: 値の割り当てがインプレース変更を意味するのはどのような場合ですか?

DDD
DDDオリジナル
2024-12-16 16:54:11449ブラウズ

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

不変型と可変型: 概念の明確化

プログラミング言語を扱う場合、不変型と可変型の区別を理解することが重要です。クエリで提供される例では、この概念に関して疑問が生じます。

不変型の構成要素?
不変型は、作成後に値を変更できないオブジェクトです。次の例に示すように、Float オブジェクトは不変であると見なされることがよくあります。

class RoundFloat(float):
    def __new__(cls, val):
        return float.__new__(cls, round(val, 2))

この例では、Float 型を拡張するクラスを定義します。ただし、new メソッドは、オブジェクトの作成時に確立された基になる浮動小数点値を変更しません。同様に、例:

class SortedKeyDict(dict):
    def __new__(cls, val):
        return dict.__new__(cls, val.clear())

は、dict 型を拡張するクラスを作成します。new は、作成時に辞書からすべてのキーを削除します。 RoundFloat と SortedKeyDict は両方とも、新しい メソッドが元の値を変更しないため、不変性を示します。

可変型: インプレース変更
対照的に、可変型は値のインプレース変更が可能になります。例:

class SortedKeyDict_a(dict):
    def example(self):
        return self.keys()

は、キーのリストを返すメソッド例を使用して dict 型を拡張するクラスを定義します。ただし、次に示すように、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 は float オブジェクトです。不変。ただし、代入 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。