python函数调用之间的全局变量值丢失
问题描述:
我知道我一定错过了一些基本的东西 - 只是想确保我得到准确的答案。python函数调用之间的全局变量值丢失
我有以下代码。为什么CACHE_KEYS
仍然没有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")
答
我认为使它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]
答
的事情是在
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]
感谢所有的答案。我明白了。而不是使用'global',我更喜欢w /'CACHE_KEYS.extend([x [3] for x in CACHE])'并且在开始时使'CACHE_KEYS'成为一个列表。 – ShuaiYuan 2013-04-25 14:10:52