如何在python中更新全局变量

时间:2013-06-25 21:03:35

标签: python list function global

在python中,我有一个函数可以返回网站上最新链接(到文件夹)的列表。我还有另一个从这些文件夹下载最新文件的功能。我计划每天运行这个脚本。我有一个全局列表,其中包含下载功能每次运行最新文件夹时访问的文件夹链接。我想每五天更新一次全局列表,并在接下来的5天内保持静态,我会运行代码直到它再次更新。

有点像这样:

list = ["link1", "link2",...]

def update():
  #code to update list
  return list

def download(list):
  #code to download from links

所以我希望更新功能每5天运行一次(我知道该怎么做)以及每天运行的下载功能。那么如何将从update()static返回的列表作为全局列表保留,直到它再次更新?

编辑: 让我试着澄清一下:

我在星期一运行:

list = ["link1", "link2"]

def update():
  #code to update list
  return list #--> list = ["link1", "link2", "link3"]

def download(list):
  #code to download from links

此工作正常,列表已更新并在下载()中使用。

我在星期二运行:

list = ["link1", "link2"]
#update() won't run today, only runs every 5 days
def update():
  #code to update list
  return list #--> list = ["link1", "link2", "link3"]

def download(list):
  #code to download from links

我重新启动了我的代码,但现在列表中没有来自星期一的link3。如何在列表中保留link3,直到我再次更新列表?

由于

3 个答案:

答案 0 :(得分:10)

使用global声明。但是如果您在原地修改它们,则不需要global可变对象。

您可以使用pickle等模块将列表存储在文件中。您可以在想要使用时加载列表,并在进行修改后将其存储回来。

lis = ["link1", "link2",...]

def update():
  global lis
  #do something
  return lis

Pickle示例:

import pickle
def update():
  lis = pickle.load( open( "lis.pkl", "rb" ) ) # Load the list
  #do something with lis                     #modify it 
  pickle.dump( lis, open( "lis.pkl", "wb" ) )  #save it again

为了获得更好的性能,您还可以使用cPickle模块。

More examples

答案 1 :(得分:2)

变量的正常声明将使其成为本地 使用global关键字使其呈现为全局。

只需将列表写入文件并访问它,稍后再从中读取。

如果您不想自行运行代码,可以使用cron-job为您执行此操作。

def read_file(filename):
    f = open(filename).read().split()
    lis = []
    for i in f:
            lis.append(i)
    return lis 

def write_file(filename,lis):
        f = open(filename,"w")
        for i in lis:
                f.write(str(i)+'\n')

答案 2 :(得分:1)

只要它在主程序中声明而不在函数范围内,您就可以从那里操纵list变量(您的评论)就好了。如果要在方法范围内将其初始化为全局,可以使用global关键字将范围扩展到整个程序

list = ["link1", "link2",...]

def update():
  list.append("link25")
  return list

会根据需要将link25附加到全局列表

如果您希望列表在运行之间保持持久性,您可以将其保存到文件并每次从该文件加载它或将其保存到数据库并从数据库加载它(如果您需要它在多台计算机上工作)

您可以通过执行此操作将列表中的项目写入文件

for item in thelist:
    thefile.write("%s\n" % item)

source