1

.sh シェル ファイルによって実行されるスクリプトがほとんどない Python プロジェクトがあります。

スクリプト間で使用される辞書を定義する構成ファイルがあります。

config.py

name_dict = dict()

file1.py

from config import *
..
..

## I have that reads tries to load the dump file that will contain the json values. 

name_dict = json.load(open(dict_file))

##This file - file1.py calls another function fun() in file2.py, iteratively 3/4 times. 
..    
file2.fun(args)
print "Length of dict in file1.py : %d " %len(name_dict) // Always Zero ??? Considers name_dict as local variable.

file2 - file2.pyで、グローバル キーワードで name_dict を定義しました。fun() は name_dict を使用および更新し、最後に最初に dict の長さを出力し、更新されていることがわかりました。

def fun(args)    
    global name_dict
    print "Length of dict file2.py(start): %d " %len(name_dict)
    ..
    ..
    print "Length of dict file2.py(end): %d " %len(name_dict)

コントロールが file2 から戻るたびに、file1.py でname_dictの値を出力し、それはゼロです。しかし、fun() への次の呼び出しでは、-> print ステートメントは引き続き name_dict() のグローバル値 (長さ) を出力します。

しかし、file1.py では常にゼロです。私の推測では、それはローカル変数として扱われます。これを修正するにはどうすればよいですか?

4

2 に答える 2

2

Python にはグローバル変数がありません。変数はすべてモジュールに含まれているため、定義したものはモジュールレベルの変数であると言えます。

モジュール変数を変更するには、それをモジュールに割り当てる必要があります。

#file1.py
import config

config.name_dict = json.load(...)

やっている:

from config import *

name_dict = json.load(...)

simple は、新しい name_dictモジュール レベルの変数を作成し、それに新しいオブジェクトを割り当てます。モジュール内の何も変更しません。config

また、このglobalステートメントは、与えられた名前をローカル変数として扱うべきではないことを python に伝えていることにも注意してください。例えば:

>>> x = 0
>>> def function():
...     x = 1
... 
>>> function()
>>> x
0
>>> def function():
...     global x
...     x = 1
... 
>>> function()
>>> x
1

他のモジュールからアクセスできるわけではありません。また、変数に割り当てるx場合にのみ役立ちます。

>>> x = 0
>>> def function():
...     return x + 1
... 
>>> function()
1
>>> def function():
...     global x
...     return x + 1
... 
>>> function()
1

xご覧のとおり、モジュール レベルであると言わなくても参照できますglobal。あなたができないことはx = something、モジュールレベルの変数値を変更することです。

于 2013-09-30T20:37:05.607 に答える