5

1つの関数しか使用されていない定数を宣言する場合、その関数がその関数でのみ使用されているか、決して変更されないので、その変数をローカルで宣言する必要がありますか?(python)私の変数はローカルかグローバルか?

優れているIE:

CONSTANT = (1, 3, 5, 8) 

##SOME OTHER CODE HERE 

def function1(arg): 
    if arg in CONSTANT: 
     do something 

か:

def function1(arg): 
    CONSTANT = (1, 3, 5, 8) 
    if arg in CONSTANT: 
     do something 

私は、これら2つの違いがたくさんあるではないですけど、私はちょうど2つのプラクティスのどちらを知りたいと思いました私はちょうど始まり、良い習慣を形成したいので、これが好ましい。

+1

良い質問です。 :)しかし、「定数」は複数回使用されていますか?この例ではnoを示唆していますが、これを明確にしたいかもしれません。一度しか使用しない場合は、名前を付ける必要はほとんどないので、関数内で何度も使用する予定があることを示すことができます。 – EOL

+0

個人的には、私は2回使用するつもりはないと思っても名前を付けることをお勧めします。私は、表現の中でリテラルを使用しないことを大いに支持しています。特に、それらが複数回使用されている場合は特にそうです。しかし、それらが一度だけ使用される場合、私はそれをあなたのやり方で見ることができます。 – acjay

答えて

3

私はローカルに保管します。クラス内でメソッドを作成し、定数をクラス変数に変換することで、関数間で共有する必要がある場合は、将来グローバルに移動することができます。このような状況では、一般的に言えば、2番目の例のように、関数内の実装情報を隠すことは、よりローカルで、より良い、そして最良です。ここでは大きな違いはありませんが、プロジェクトが大きくなるにつれて、メンテナンス性とモジュール性が維持されます。

+0

定数はローカルバージョンで1回だけ作成されるか、1回の呼び出しで1回作成されますか? –

+1

@ JoachimIsaksson:ファイルがロードされたときに1回だけ作成されます。それは記憶に残るでしょう。 –

+1

値が1回だけ作成されたとしても、(CPython 2.7.3では)実行ごとに 'CONSTANT'変数に値が再度格納されます。これは 'dis.dis()'を通して見ることができます。 – EOL

1

私はので、グローバルにそれらを置く:Pythonでは

  • 定数

    1. あるあなた変数、グローバルスコープはあなたの変数は事実のみであることを意味し、モジュールの名前空間でカプセル化されていますモジュール内のグローバル
    2. あなたの関数を何度も呼び出すと、その定数をローカルに置くと、その関数を呼び出すたびにその関数を再割り当てします。
    3. 次に、さまざまな機能間で定数を共有できます。

    ただし、オブジェクト指向プログラミングに移行すると、定数をクラス変数として配置します。

  • +1

    定数は毎回再割り当てされません。それらは一度割り当てられ、参照によって参照されます。 –

    +1

    (1)のために、私はあなたのポイントを得るか分からない。 (2)の場合、モジュール変数は組み込み関数のように「グローバル」ではありませんが、それはその点の一種です。真にグローバルな変数に対する同じ基本的な議論は、局所的な範囲のどのレベルでも、より少ない程度で適用されます。このロジックを何百もの関数を持つプロジェクトに拡張し、実際のコードにはあまり関係しない変数の混乱を起こし始めます。関数は消え始め、それらの結合されていない定数は残っています。私にとって、(3)は早すぎる最適化であり、(4)はYAGNIです。 – acjay

    0

    私は最高のものはは状況によって異なります

    実行時間に問題がない場合の場合、毎回新しい変数に定数をロードするのに時間がかかりません。これは、コード内で定数がどこに使用されているかを明示的に示すという明白な利点があります。

    これ以外の場合、グローバルは問題ありませんが、最適化の目的でのみ行います。もし私がそれについて考えるなら、の最適化は私があなた自身と同じ質問をした唯一の理由です。あなたのプログラムのユーザーは、多くの場合、コード内でその値を変更する必要があるとあなたがプログラムの引数を解析したくない、

  • 場合

    • グローバルを使用するために他の正当な理由があるかもしれません他のプログラムからアクセスする必要がある場合は

    • など

    結論として、私は言う:あなたが感じることは一番ですが、彼らが所属する場所で合理的に可能な限りカプセル化しようとします(地元民はグローバルに優先されるべきです)。

  • 関連する問題