1. ホーム
  2. java

Pythonの変数で `final` キーワードが相当するか?

2023-10-31 12:23:16

質問

Java の final に相当するドキュメントをPythonで見つけられませんでした。そのようなものがあるのでしょうか?

私はオブジェクトのスナップショットを作成しています(何か失敗したときに復元するために使用します)。このバックアップ変数が割り当てられると、それは変更されてはいけません -- Pythonのfinalのような機能は、このために素晴らしいでしょう。

どのように解決するのですか?

Javaで変数を持つことは final であることは、一度変数に代入すると、その変数が他のオブジェクトを指すように再代入できないことを意味します。 実際には、そのオブジェクトを変更できないという意味ではありません。 例えば、次のようなJavaのコードは全く問題なく動きます。

public final List<String> messages = new LinkedList<String>();

public void addMessage()
{
    messages.add("Hello World!");  // this mutates the messages list
}

と書いても、以下はコンパイルすらできません。

public final List<String> messages = new LinkedList<String>();

public void changeMessages()
{
    messages = new ArrayList<String>();  // can't change a final variable
}

つまり、あなたの質問は final がPythonに存在するかということです。 それはありません。

しかし、Pythonにはimmutableなデータ構造が存在します。 例えば list を変異させることができますが tuple . を変異させることができます。 set を変異させることはできますが frozenset など。

私のアドバイスは、言語レベルで突然変異を起こさないようにすることを気にせず、オブジェクトが割り当てられた後に突然変異を起こすようなコードを書かないようにすることに集中することです。