2

基本的なことを見逃しているに違いないことはわかっています。正確な答えを得たいだけです。

次のコードがあります。しばらくしCACHE_KEYSても None になるのはなぜですか?load()CACHE

import bisect
import csv

DB_FILE = "GeoLiteCity-Location.csv"

# ['locId', 'country', 'region', 'city', 'postalCode', 'latitude', 'longitude', 'metroCode', 'areaCode']
CACHE = []
CACHE_KEYS = None


def load():
    R = csv.reader(open(DB_FILE))

    for line in R:
        CACHE.append(line)

    # sort by city
    CACHE.sort(key=lambda x: x[3])

    CACHE_KEYS = [x[3] for x in CACHE]


if __name__ == "__main__":
    load()

    # test
    # print get_geo("Ruther Glen")
4

2 に答える 2

6

global作るとうまくいくと思います。編集するグローバルスコープで定義された変数はglobal、その関数のように指定する必要があります。コードはローカル変数CACHE_KEYSを作成し、情報を正しく格納するだけです。ただし、それがグローバル変数に確実にコピーされるようにするには、変数をglobal関数内のように宣言します。append関数を呼び出すと、正常に機能しCACHEます。変更後のコード。

import bisect
import csv

DB_FILE = "GeoLiteCity-Location.csv"

# ['locId', 'country', 'region', 'city', 'postalCode', 'latitude', 'longitude', 'metroCode', 'areaCode']
CACHE = []
CACHE_KEYS = None


def load():
    R = csv.reader(open(DB_FILE))

    for line in R:
        CACHE.append(line)

    # sort by city
    CACHE.sort(key=lambda x: x[3])
    global CACHE_KEYS
    CACHE_KEYS = [x[3] for x in CACHE]


if __name__ == "__main__":
    load()

グローバル変数に値を割り当てるときはいつでも、それを として宣言する必要がありますglobal。次のコード スニペットを参照してください。

listOne = []
def load():
    listOne+=[2]
if __name__=="__main__":
    load()

上記のコードにはappend呼び出しではなく割り当てがあります。これにより、次のエラーが発生します。

UnboundLocalError: local variable 'listOne' referenced before assignment

ただし、次のスニペットを実行します。

listOne = []
def load():
    listOne.append(2)
if __name__=="__main__":
    load()

次の出力が得られます。

>>> print listOne
[2]
于 2013-04-25T14:02:23.570 に答える
1

物は入っています

CACHE_KEYS = [x[3] for x in CACHE]

CACHE_KEYSグローバルスコープで定義されています。上記の行では、新しい値を割り当て、ローカル スコープに持ち込んでいます。関数内で変数を操作する (そして後でその値を保持する) ために、次のようにglobalなります。

def load():
    global CACHE_KEYS
    ...
    CACHE.sort(key=lambda x: x[3])
    CACHE_KEYS = [x[3] for x in CACHE]
于 2013-04-25T14:08:50.973 に答える