2013-04-25 91 views
0

我知道我一定错过了一些基本的东西 - 只是想确保我得到准确的答案。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") 
+0

感谢所有的答案。我明白了。而不是使用'global',我更喜欢w /'CACHE_KEYS.extend([x [3] for x in CACHE])'并且在开始时使'CACHE_KEYS'成为一个列表。 – ShuaiYuan 2013-04-25 14:10:52

回答

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] 
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]