2012-04-19 25 views
2

私はPythonのベストプラクティスを理解しようとしています。グローバル変数にアクセスする(しかし変更しない)関数を定義する場合、関数内で変数をグローバルとして指定する必要はありません。しかし、グローバル変数を関数に渡す方が速いのでしょうか?私は、グローバル変数を検索するコストについていくつか言及してきたので尋ねますが、私は理解しているかどうかはわかりません。たとえば、Python関数:グローバル変数にアクセスする場合にのみ渡しますか?

def f1(localList): 
    for element in localList: 
     if element in globalSet: 
      pass #do stuff. 

def f2(localList, localSet): 
    for element in localList: 
     if element in localSet: 
      pass #do stuff. 

globalList = <arbitrary list> 
globalSet = <arbitrary set> 

f1(globalList) 
f2(globalList, globalSet) 

f2は、f1と比較して一般的にはより高速で優れた/より優れた「pythonic」アプローチと見なされますか?

+0

あなたは何をしようとしているのかの本当の例を共有できますか?他のアプローチよりも1つのアプローチを選択すると、設計上の選択肢になる可能性があります。 (悪いデザインはグローバルを使用していますが、どちらの場合でも使用していないことを確認してください)。 –

+0

実際に私はこの場合、特別な例はありません。それは私がいくつかのスクリプトを書いたことであり、これについての一般的なルールや規約があるかどうかは私の心の中にあります。私はPythonがf1でglobalSetに透過的にアクセスできるようにしていますが、globalSetが大きい場合はf2が望ましいと思われますが、globalSetをf1のループの繰り返しごとに調べなければならないのでしょうか? – user1344806

+0

いいえ、それはその理由の方が好きです。それは本当に重要です。あなたが実際に構築しているものに応じてデザインを選択します。 Pythonでは、物事を行うための明白な方法しかないはずなので、あなたの疑念は悪いデザインのサインかもしれません。たぶんクラスが必要なのかもしれません。 –

答えて

0

グローバルの使用は、常に悪い設計の選択です。いずれにしても、グローバルを使用しないでPythonicになるソリューションを常に思いつくことができます。

  • 関数間で多くの変数を共有する必要がある場合は、 はOOアプローチを再考することができます。
  • 多くのパラメータを 関数に渡す必要がある場合は、varargsまたはkargsを選択できます。

パラメータは参照によって渡されるため、効率が低下することはありません。

----特殊なケースは、ルールを破るのに十分ではありません。

0

globalListglobalSetデータはしっかりと私はクラスを使用して(私は何が必要か、インスタンスメソッド、)staticmethodsとしてクラスpropiertiesおよびそれらの機能として、これらのリストを定義したい関数にバインドされている場合

0

グローバル変数でありますgenerally considered bad practice一般的なプログラミングです。基本的に、変数を見ることができるコードであればそれを変更することができるからです。特にマルチスレッドのプログラムでは、これがバグの原因になる可能性があります。

Pythonの変数は、名前やオブジェクトへの参照として考えるべきです。したがって、変数を関数に渡すのはコストがかかりません。

関連する問題