如何在python中更新全局变量

Posted

技术标签:

【中文标题】如何在python中更新全局变量【英文标题】:how to update global variable in python 【发布时间】:2013-06-22 20:22:05 【问题描述】:

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

有点像这样:

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

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

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

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

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

我在星期一运行:

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。在我再次更新列表之前,如何在接下来的 5 天内将链接 3 保留在列表中?

谢谢

【问题讨论】:

【参考方案1】:

使用global 语句。但是,如果您要就地修改可变对象,则不需要global

您可以使用pickle 之类的模块将您的列表存储在一个文件中。您可以在需要使用时加载列表,并在修改后将其存储回来。

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

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

泡菜示例:

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

【讨论】:

是的,但这将在脚本运行时更新列表。该脚本将在几分钟后关闭。当我第二天运行它时,我希望它与前一天更新返回的列表相同。我希望我足够清楚。感谢您的帮助! @VaibhavAggarwal 我猜你需要使用像 pickle 这样的模块来存储你的列表对象,请参阅我更新的答案。 @VaibhavAggarwal 我添加了一个与泡菜相关的示例。 @VaibhavAggarwal Go for cPickle 然后,它可以比 pickle 快 1000 倍。【参考方案2】:

只要它在主程序中声明并且不在函数范围内,您就可以从那里(您的注释)操作您的 list 变量。如果你想在一个方法的范围内将它初始化为全局,你可以使用global关键字将范围扩大到整个程序

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

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

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

如果您希望您的列表在运行之间保持不变,您可以将其保存到文件中并每次从该文件中加载,或者将其保存到数据库中并在需要它在多台机器上工作时从数据库中加载它

您可以通过这样做将列表中的项目写入文件

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

source

【讨论】:

【参考方案3】:

变量的正常声明将使其成为本地变量。 使用 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')

【讨论】:

谢谢,但如果您不介意,您能否编写一个示例代码来访问该文件、写入并保存它?

以上是关于如何在python中更新全局变量的主要内容,如果未能解决你的问题,请参考以下文章

如何将破折号输入保存为全局变量

python接口自动化小技巧-全局变量

在Postman中如何设置全局变量?

使用 time.time() 更新 Python 全局时间变量不起作用

如何使用 AsyncTask 更新全局变量

python 中怎么对一个全局的图变量在函数中进行值修改