読み取りではあいまいさはなく、書き込みではあいまいさがないことを自分で言います。したがって、書き込みによるあいまいさを解決するためのメカニズムが必要です。
1つのオプション(おそらく実際にはPythonのはるかに古いバージョンであるIIRCで使用されています)は、書き込みは常にローカルスコープに送られると言うことです。global
そうすれば、キーワードやあいまいさは必要ありません。しかし、グローバル変数に書き込むことはできません(globals()
ラウンドアバウトで取得するなどの方法を使用しないと)。そのため、それは素晴らしいことではありません。
変数を静的に宣言する言語で使用される別のオプションは、ローカル(そのスコープで宣言する名前)とグローバル(モジュールスコープで宣言される名前)のすべてのスコープについて、言語実装に事前に通信することです。 。ただし、Pythonには変数が宣言されていないため、このソリューションは機能しません。
もう1つのオプションはx = 3
、nameを持つ外部スコープに名前がまだない場合にのみ、ローカル変数に割り当てることですx
。直感的に正しいことをするように思えますか?しかし、それはいくつかのひどく厄介なコーナーケースにつながるでしょう。現在、x = 3
書き込み先はパーサーによって静的に決定されます。global x
同じスコープに存在せず、ローカル書き込みであるか、または存在し、global x
グローバル書き込みであるかのいずれかです。ただし、それが何をするかがグローバルモジュールスコープに依存する場合は、実行時まで待機して、書き込みがどこに行くかを決定する必要があります。つまり、関数の呼び出し間で変更される可能性があります。。それについて考えてください。モジュールでグローバルを作成するたびに、その名前をローカル変数名として使用していたモジュール内のすべての関数の動作を変更します。一時変数として使用するモジュールスコープの計算を実行し、モジュール内のすべての関数での使用にtmp
別れを告げます。そして、インポートしたモジュールに属性を割り当て、そのモジュールから関数を呼び出すことを含む、あいまいなバグについて考えると、私は震えます。うん。tmp
また、別のオプションは、各割り当ての言語実装に、ローカルかグローバルかに関係なく通信することです。これはPythonが採用したものです。ほとんどすべての場合(ローカル変数への書き込み)をカバーする賢明なデフォルトがあることを考えると、デフォルトとしてローカル割り当てがあり、グローバル割り当てを明示的にマークアウトしglobal
ます。
割り当てにはあいまいさがあり、それを解決するために何らかのメカニズムが必要です。global
そのようなメカニズムの1つです。可能なのはそれだけではありませんが、Pythonのコンテキストでは、すべての代替メカニズムが恐ろしいようです。あなたがどんな「より良い理由」を探しているのか分かりません。