1

私はPythonが初めてなので、おそらく簡単な答えがありますが、何を検索すればよいかさえわかりません。簡単なコード スニペットを次に示します。

testing = 1
print testing

def update():
    print "UPDATED"
    testing = 2

update()
def test():
    new = testing
    print new

test()

私の予想では、最後の印刷は「2」ですが、代わりに「1」です。なぜこれが起こるのですか?

特定の変数の init/update からの UNIX 時間が、特定の関数 (while ループを含む) が実行を開始したときと同じかどうかを確認できるようにするために、これが必要です。これを達成するためのより良い方法があれば教えてください。

4

4 に答える 4

3

グローバル変数を使用する場合 (これは一般的に悪い考えであり、可能であれば避ける必要があります)、次のようにtesting、変数がグローバルであることを変更する各関数内で示す必要があります。

def update():
    global testing # mandatory: the variable is being modified
    print "UPDATED"
    testing = 2

globalinを明示的に使用する必要はありませんtest()- 値を読み取るだけで、 inupdate()で変更していますが、変数がグローバルに定義されているという残りの部分として役立ちます

def test():
    global testing # not mandatory, but useful as documentation
    new = testing
    print new
于 2013-10-28T22:25:40.547 に答える
1

関数内で変数をグローバルに宣言する必要があります (グローバル テストを記述します)。

于 2013-10-28T22:25:44.930 に答える
1

testing関数のローカル変数ですupdate()。関数ローカルは、モジュール グローバルとは完全に分離されています。

スコープ内で名前を割り当てると、Python はその名前をローカルとしてマークします。testing内に割り当てられますupdate()newも intest()に割り当てられますが、その機能testingでは ではありません。これによりtesting、 intestがグローバルになります。このようにして、Python では、モジュールで宣言された、または別のモジュールからインポートされた組み込み、関数、およびその他のオブジェクトを見つけることができます。

関数内の名前に代入し、それをグローバルとして扱いたい場合は Python を明示的にオーバーライドして、名前をグローバルとして扱うように指示する必要があります。

def update():
    print "UPDATED"
    global testing
    testing = 2

global関数内のどこにでもステートメントを配置できます。これにより、その特定の名前が関数全体に対してグローバルになります

于 2013-10-28T22:26:42.880 に答える
0

Oscar と Martijn がすでに示した適切な回答に何かを追加しようと思います。

Python で関数を読み取るときは、どの関数でも、2 回読み取る必要があります。いつも。

最初のパスでは、次のことを行う必要があります。and 宣言ステートメントごとglobalnonlocal、それらを (概念的に) 関数の先頭に移動します。

次のフォームの各ステートメントについて

* x = expr (or "x += expr", "x *= expr", etc.)
* for x in expr:
* with expr as x:
* def x(...):
* class x:
* import x (or "import foo as x")
* from some_module import x (or "from some_module import foo as x")

x という名前を見てください。それがglobalornonlocalステートメントで宣言されている場合は、そのままにしておきます。それ以外の場合は、宣言のandlocalの直後に追加します。(pythonにはキーワードはありません。すべて概念的なものです)。関数パラメーターは常にローカルです。これらのステートメントの名前は、それらが参照するスコープと同様に、相互に排他的である必要があります。globalnonlocallocal

これが最初のパスでした。これで、座ってコードを読むことができます。変数名を目にするときはいつでも、これらの 3 つのステートメントでそれを調べます -globalnonlocal、私たちの架空のlocal. 名前があれば、それがどこに属しているかがわかります。それ以外の場合は、囲んでいる関数で同じ方法で検索し、次にグローバル名前空間で検索します。そこにない場合は、組み込みまたはエラーである必要があります。

に対してそれを行うとupdate()、次のようになります。

def update():
    local testing # not real python code
    print "UPDATED"
    testing = 2

ええと、それはあなたが意図したものではありませんよね?

前の別の例:

x=3
def print5():
    for i in range(5):
        print(x)
        x += 1

後:

x=3
def print5():
    local i, x
    for i in range(5):
        print(x) # oops. x is local but was not assigned!
        x += 1

私が説明したアルゴリズムは完全ではないことに注意してください。except句の名前のみを非表示にする例外を省略しました。evalそしてexec; とfrom some_module import *

完全な情報については、次のドキュメントを参照してください: http://docs.python.org/2/reference/executionmodel.html#naming-and-binding

于 2013-10-28T22:26:26.370 に答える