26

多くの言語 (および場所) では、このようなブロックを作成してローカル スコープを作成するという優れた方法があります。

void foo()
{
     ... Do some stuff ...

     if(TRUE)
     {
         char a;
         int b;

         ... Do some more stuff ...
     }

     ... Do even more stuff ...
 }

予期しないインデントエラーが発生せず、何らかのif True: トリックを使用せずに、Python でこれを実装するにはどうすればよいですか?

4

12 に答える 12

9

Pythonでは、スコープにはグローバル、ローカル、クラスの3つのタイプがあります。exec / eval()に渡すための特殊な「スコープ」辞書を作成できます。さらに、ネストされたスコープを使用できます(別の関数内で関数を定義します)。私はこれらが私のすべてのコードで十分であることがわかりました。

Douglas Leederがすでに述べたように、他の言語でそれを使用する主な理由は可変スコープであり、それはPythonでは実際には起こりません。さらに、Pythonは私が今まで使用した中で最も読みやすい言語です。if-trueトリック(避けたいと言う)のようなことをすることは、読みやすさに反します。その場合、最善の策は、コードを複数の関数にリファクタリングするか、単一のスコープを使用することだと思います。Pythonで利用可能なスコープは、すべての不測の事態をカバーするのに十分であると思います。したがって、ローカルスコープは実際には必要ありません。

于 2009-02-12T16:10:01.440 に答える
9

とにかくPythonで新しいスコープを作成したいのはなぜですか?

他の言語でそれを行う通常の理由は変数のスコープですが、Python ではそうはなりません。

if True:
    a = 10

print a
于 2009-02-12T15:57:19.583 に答える
5

一時変数を作成し、それらを使用した直後にガベージコレクションさせたい場合は、次を使用できます。

del varname

もう欲しくないとき。

美学のためだけの場合は、コメントや追加の改行を使用できますが、追加のインデントは使用できません。

于 2009-02-12T16:11:08.007 に答える
5

Python には、ローカルとグローバルの 2 つのスコープがあります。関数で使用される変数は、作成されたインデント レベルに関係なく、ローカル スコープにあります。ネストされた関数を呼び出すと、探している効果が得られます。

def foo():
  a = 1

  def bar():
    b = 2
    print a, b #will print "1 2"

  bar()

他の皆さんと同じように、関数内に制限付きスコープを作成する理由を尋ねなければなりません。

于 2009-02-12T16:23:30.020 に答える
3

スコープは、名前空間に直接アクセスできる Python プログラムのテキスト領域です。ここでの「直接アクセス可能」とは、名前への非修飾参照が名前空間で名前を見つけようとすることを意味します...

ドキュメントを読んで、質問を明確にしてください。

if(TRUE){}ところで、 C では必要ありません。単純な{}もので十分です。

于 2009-02-12T16:21:43.550 に答える
3

リスト内包表記 (Python 3+) の変数とジェネレーターはローカルです:

>>> i = 0
>>> [i+1 for i in range(10)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> i
0

しかし、なぜこれが必要なのですか?

于 2009-02-12T15:57:57.430 に答える
2

これは、新しい関数を作成してコードをリファクタリングする時期が来たことを明確に示していると思います。そのような新しいスコープを作成する理由がわかりません。何か理由はありますか?

于 2009-02-12T16:01:19.323 に答える
1
def a():
    def b():
        pass
    b()

追加のインデントが必要な場合、またはデバッグ中の場合は、使用しますif True:

于 2009-02-12T16:03:19.927 に答える
0

他の人が示唆しているように、囲んでいる名前空間を汚染することなくコードを実行する Python の方法は、それをクラスまたは関数に入れることです。これは、通常は無害なわずかな問題を引き起こします。関数を定義すると、その名前が囲んでいる名前空間に配置されます。これが害を及ぼす場合は、Python の従来の一時変数「_」を使用して関数に名前を付けることができます。

def _():
    polluting_variable = foo()
    ...
_() # Run the code before something overwrites the variable.

これは、各ローカル定義が外側のスコープからの定義をマスクするため、再帰的に実行できます。

この種のことは、非常に特定の状況でのみ必要になるはずです。これが役立つ例は%run、現在のノートブックのグローバル スコープで別のノートブックの内容を実行する Databricks のマジックを使用する場合です。子ノートブックのコマンドを一時的な関数でラップすると、それらがグローバル名前空間を汚染するのを防ぎます。

于 2019-12-18T20:22:54.883 に答える