8

さて、私は変数がローカルに設定されたが、その関数の外側が古い自己(この場合はNone)に戻ったというこの本当に厄介な問題を抱えていましたが、同時に他の変数を操作することができ、それでも使用せずにできます「グローバル」キーワード。

このための実際のコードを提供することはできませんが、次のようになります。

foo = {}
foo_foo = {}
bar = None


def changes_foo():
    ...do some stuff to foo...

class EditThread(threading.Thread):

    def __init__(self):
        setup()

    def run(self):
       for key, value in foo.items():
           do_update_task(key, value)

    def do_update_task(self, key, value):
         ...do some editing too foo...
         del foo[key]
         bar = [key, value]
         foo_foo[key] = value

def print_the_bar():
    print bar 

上のすべての操作は正常foofoo_foo機能しますが、を呼び出すとbarはNoneのままprint_the_barであり、コード内に多くのprintステートメントがあり、内部のbarがdo_update_task実際に正しい値であり、Noneではないことを確認しています。

なぜそうなのか説明してもらえますか?

4

4 に答える 4

15

関数内のグローバル変数の値を読み取るだけでよい場合は、globalキーワードは必要ありません。

x = 3
def f():
    print x

グローバル変数の値を設定したことがある場合は、ローカル変数を作成しないようにキーワードが必要です。

x = 3
def f():
    global x
    x = 5

f()
print x
于 2012-08-08T15:06:05.687 に答える
8

fooとfoo_fooに対して何かを行う場合、参照を変更することはありません。

foo = {}
foo['key'] = 'stuff'

foo以前と同じオブジェクトを引き続き参照します。ちょうど今、より多くのデータが含まれています。

bar = ['key', 'value']

これにより、新しいオブジェクト(2つの要素を持つリスト)を参照するように再割り当てされます。 bar

ただし、その行が関数内で検出されると、特に指定しない限り、ローカル参照が作成さbarれますglobal barbar実際には、グローバルとローカルという2つの異なる変数があります。

Sayingは、同じ名前で新しいローカル変数を作成するのではなくglobal bar、のグローバルバージョンを使用するようにPythonに指示します。bar

一般に、グローバル変数を変更する場合は、global varname誤ってローカル変数を作成しないように、各変数について説明する必要があります。

または、クラスを使用できます。

class State(object):
    def __init__(self):
        self.foo = {}
        self.foo_foo = {}
        self.bar = None

state = State()

def fn():
    state.bar = ['key', 'value']
于 2012-08-08T15:05:22.550 に答える
0

関数内からグローバルスコープから変数を読み取ることはできますが、「global」キーワードを使用せずに値を変更することはできません。

を設定しようとすると、関数の名前空間にbar =[key, value]新しいbar変数が追加されます。それ以降barは、グローバル変数ではなく、この新しい変数を参照します。

グローバルの値を読み取ることはできますがbar、関数内から値を再割り当てしようとすると、実際には新しい値が作成されbar、グローバルの値に作用していません。

于 2012-08-08T15:13:19.570 に答える
0

関数で定義した変数には、この関数の本体からのみアクセスできます。

于 2012-08-08T15:01:32.083 に答える