2

作成されると、Python 複素数は読み取り専用になります。

>>> x = complex(1,1)
>>> x
(1+1j)
>>> x.real=2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: readonly attribute

新しい複素数を構築せずにPythonで複素数を変更するにはどうすればよいですか? これは不必要な制限のように思えます。複合体がこのように実装された理由はありますか?

4

3 に答える 3

4

Pythonのすべての数値(および文字列も)は不変です。これにより、いくつかの点で計算が容易になり(つまり、Pythonインタープリターのパフォーマンスが向上します)、通常、それほど問題は発生しません。

もちろん、別の値の値を再利用するには、次のようにします。

x = complex(2, x.imag)
于 2013-03-19T16:00:02.103 に答える
2

Python の不変の数値にはいくつかの理由があります。

1) 複数の変数が同じオブジェクトを指すことができるようにすることで、メモリを節約します。

>>> x = 3 + 4j
>>> y = x
>>> x is y
True

2) 不変性は、ハッシュ可能性と密接に関連しています。数値を辞書のキーやセットの要素として使用するのに適したものにします。

>>> d = {}
>>> d[3 + 4j] = 'red'
>>> d[3 + 4j]
'red'

3) Python のカスタム メモリ管理では、これらのオブジェクトは割り当てと解放を繰り返すのではなく、再利用される傾向があります。これにより、「新しいオブジェクトを作成する」コストが軽減されます。

于 2013-03-19T16:32:18.110 に答える
1

簡単に:

新しい複素数を構築せずにPythonで複素数を変更するにはどうすればよいですか?

あなたはそうしない。古い複素数の要素を使用するか (これを頻繁に行う場合は、そのための関数を作成できます)、独自の複素数クラスを作成できます。

複合体がこのように実装された理由はありますか?

複素数は数値型であり、すべての Python 数値型と同様に不変です。

より長い説明:

int、 a float、 a namedtuple、または aを変更することはできませんfrozenset。複素数を変更することはできません。複素数は不変であり、利点があります (その中で最も重要なものの 1 つは、複素数を辞書のキーとして使用できることです)。複素数で実行する操作のほとんどは依然として数学的なものであるため、(他のすべての数値型と同様に) 不変性に適しています。そうでない場合は、おそらく__slots__属性を使用して、独自のクラスを作成することを検討してください。

私のアドバイス: 一部の開発者は、データ構造の不変性を目指して努力しています。これにより、プログラミングとデバッグの複雑さが大幅に軽減されます。Python の複素数は適切に設計されています。

于 2013-03-19T16:05:58.343 に答える