2017-05-17 40 views
2

私は好奇心が強いです。私はsooooomewhat Pythonの新しいです。私は1年ほど以上コーディングしてきましたが、私がカバーしたことは完全には理解できませんでしたが、「グローバル変数は悪い」という悪影響でした。Python:グローバル変数の代わりにリスト項目を使う

私は初心者であり、なぜグローバル変数を避けるべきか(または慎重にすべきか)というオンライン説明を理解できませんでした。私は誰もが心に留めていたことをすべて取り上げ、グローバル変数は単にランタイム中に自分のコードを惑わし、すべてのデータを食べる不吉なモンスターであるという前提を作りました。

は、だから私は、次の操作を行うようになった:

>>> SomeVar = [0]  # To avoid the 'global' keyword, I'll just make a single list item. 
>>> 
>>> def increment():  # Hey look, it's practically global! 
>>>  SomeVar[0] += 1 
>>> 
>>> increment() 
>>> increment() 
>>> 
>>> SomeVar 
[2] 

いくつかの時間後、私は最終的に私が印象Iを得るために始めている、問題のいくつかの実際の研究を行うための知識と経験を持っているがポイントを逃した可能性があります。グローバル化が名前空間を占有し、マルチスレッドで問題を提示する可能性があること、そしてあまりにも多くの関数が同時にアクセスすることが困難になることは知っていますが、私はまだ理解できません。聞きたかった。

私のlist-global-aversion変数は、実際にはの問題がグローバル変数に存在するかどうかを確認するのに役立つのですか?私は、前述の問題(マルチスレッド、スパゲッティコード)でうまくいかない理由を知ることができますが、それはまったく役に立ちますか?

ありがとうございます!

+0

'SomeVar'は*グローバル変数です。あなたが避けたのは 'global'キーワードを使うことだけです。 – timgeb

+0

あなたの例では、 'globals()'と入力すると、SomeVarがリストであっても数字であっても、グローバル辞書に表示されます。 :-) –

答えて

3

はい、あなたはその点を見逃しています。あなたが作成したものは、まだグローバル変数です。あなたがしたのはキーワードの周りでの作業でした。

これをフルプログラムに展開すると、Somevarの初期化はその使用法から大きく切り離されている可能性があります。あなたは、あなたの機能を未知の場所と起源の外部変数に依存させておきました。代わりに、これを試してください:

def increment(var):  # Hey look, it's properly local! 
    return var + 1 

somevar = 0 
somevar = increment(somevar) 
somevar = increment(somevar) 
関連する問題