我知道我一定错过了一些基本的东西 - 只是想确保我得到准确的答案。
我有以下代码。为什么CACHE_KEYS
在load()
之后CACHE
仍然没有?{/ 1}}
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")
答案 0 :(得分:4)
我认为制作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]
答案 1 :(得分:0)
事情在
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]