1

私はpythonの初心者で、質問があります。私にとって非常に混乱しています。最初に関数を定義し、その関数内で、以下の別の関数で定義されている変数を使用する必要がある場合、このようにすることはできますか? または、別の関数の戻り値を関数にインポートするにはどうすればよいですか? 例えば:

def hello(x,y):
    good=hi(iy,ix)
    "then do somethings,and use the parameter'good'."
    return something

def hi(iy,ix):
    "code"
    return good
4

5 に答える 5

5

機能の範囲はhellohiはまったく異なります。それらには共通の変数はありません。

呼び出しの結果hi(x,y)は何らかのオブジェクトであることに注意してください。good関数内の名前でそのオブジェクトを保存しますhello

で指定さgoodれた変数は、関数でhello指定された変数とは無関係の別の変数です。goodhi

スペルは同じですが、異なる名前空間に存在します。これを証明するgoodには、2 つの関数のいずれかで変数のスペルを変更します。それでも機能することがわかります。


編集。hiフォローアップ: 「関数の結果を関数で使用したい場合はどうすればよいhelloですか?」

珍しいことは何もありません。よく見てくださいhello

def hello(x,y):
    fordf150 = hi(y,x)
    "then do somethings,and use the variable 'fordf150'."
    return something

def hi( ix, iy ):
    "compute some value, good."
    return good

一部のスクリプトは を評価しhello( 2, 3)ます。

  1. Python は、 の評価用に新しい名前空間を作成しますhello

  2. ではhelloxオブジェクトにバインドされています2。バインディングは位置順で行われます。

  3. ではhelloyオブジェクトにバインドされています3

  4. ではhello、Python は最初のステートメント , is 3, is 2 を評価fordf150 = hi( y, x )yますx

    を。Python は、 の評価用に新しい名前空間を作成しますhi

    b. ではhiixオブジェクトにバインドされています3。バインディングは位置順で行われます。

    c. ではhiiyオブジェクトにバインドされています2

    d. ではhi、何かが発生し、何かgoodのオブジェクトにバインドされます3.1415926

    e. ではhi、 areturnが実行されます。オブジェクトを の値として識別しますhi。この場合、オブジェクトは によって命名されgood、オブジェクト 3.1415926です。

    f. 名前hi空間は破棄されます。 goodixそしてiy消えます。ただし、オブジェクト ( 3.1415926) は評価の値として残りますhi

  5. ではhello、Python は最初のステートメント , is 3, is 2 を終了しfordf150 = hi( y, x )ますyxの値はhiです 3.1415926

    を。 、fordf150を評価することによって作成されたオブジェクトにバインドされます。hi3.1415926

  6. ではhello、Python は他のステートメントに進みます。

  7. ある時点somethingで、オブジェクトにバインドされます2.718281828459045

  8. ではhello、 areturnが実行されます。オブジェクトを の値として識別しますhello。この場合、オブジェクトは によって命名されsomething、オブジェクト 2.718281828459045です。

  9. 名前空間は破棄されます。 fordf150と と同様にsomething消えます。ただし、オブジェクト ( ) は評価の値として残ります。xy2.718281828459045hello

呼び出されたプログラムまたはスクリプトhelloが応答を取得します。

于 2008-12-10T22:36:30.167 に答える
3

関数内からグローバル名前空間への変数を定義し、それによってこのスペース内の他の関数からアクセスできるようにする場合は、globalキーワードを使用できます。ここにいくつかの例があります

varA = 5   #A normal declaration of an integer in the main "global" namespace

def funcA():
    print varA #This works, because the variable was defined in the global namespace
               #and functions have read access to this.
def changeA():
    varA = 2  #This however, defines a variable in the function's own namespace
              #Because of this, it's not accessible by other functions.
              #It has also replaced the global variable, though only inside this function
def newVar():
    global varB #By using the global keyword, you assign this variable to the global namespace
    varB = 5

def funcB():
    print varB #Making it accessible to other functions

結論:関数で定義された変数は、関数の名前空間にとどまります。変数がglobalキーワードで呼び出されていない限り、読み取り専用のグローバル名前空間にアクセスできます。

グローバルという用語は、最初は完全にグローバルではないように思われるかもしれません。これは、実際には、作業しているファイルの最も低い名前空間へのリンクにすぎません。グローバルキーワードは、別のモジュールではアクセスできません。

軽度の警​​告として、これは一部の人にとってはあまり「良い習慣」ではないと見なされる場合があります。

于 2008-12-10T23:35:45.557 に答える
2

'good' の 2 つのインスタンスは異なる変数であるため、サンプル プログラムは機能します (たまたま両方の変数が同じ名前になっているだけです)。次のコードはまったく同じです。

def hello(x,y):
    good=hi(iy,ix)
    "then do somethings,and use the parameter'good'."
    return something

def hi(iy,ix):
    "code"
    return great
于 2008-12-10T22:35:55.287 に答える
2

Python スコープ ルールの詳細については、次を参照してください。

Python スコープ ルールの簡単な説明

于 2008-12-10T23:54:34.987 に答える
1

「hello」関数は、両方の関数が定義されるまで「hello」関数を実際に使用しようとしない限り、まだ定義されていない「hi」関数を呼び出してもかまいません。

于 2008-12-10T22:37:05.767 に答える