2

我知道我一定错过了一些基本的东西——只是想确保我得到准确的答案。

我有以下代码。为什么在while is notCACHE_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 回答