как обновить глобальную переменную в python
В 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
Это сработало отлично, список был обновлен и использован в download().
Я запускаю это во вторник:
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
Я перезапустил свой код, но теперь список не имеет Ссылка 3 с понедельника. Как сохранить link3 в списке в течение следующих 5 дней, пока я не обновлю список снова?
Спасибо
3 ответов:
Используйте оператор
global. Но нет никакой необходимости вglobalдля изменяемых объектов, если вы изменяете их на месте.Вы можете использовать такие модули, как
pickleчтобы сохранить список в файле. Вы можете загрузить список, когда захотите его использовать, и сохранить его после внесения изменений.lis = ["link1", "link2",...] def update(): global lis #do something return lisРассольник пример:
Для повышения производительности можно также использовать модульcPickle .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
Нормальное объявление переменной сделает ее локальной.
Используйте ключевое слово 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')
До тех пор, пока он объявлен в основной программе, а не в рамках функции, вы должны быть в порядке, чтобы манипулировать вашей переменной
listоттуда (ваш комментарий) просто прекрасно. Если вы хотите инициализировать его как глобальный, чтобы из области метода вы можете использовать ключевое словоglobal, чтобы расширить область до всей программыlist = ["link1", "link2",...] def update(): list.append("link25") return listДобавит link25 в глобальный список, как вы хотели
Если вы хотите, чтобы ваш список сохранялся между запусками, вы можете сохранить его в файл и загрузить это из этого файла каждый раз или сохранить его в базу данных и загрузить его из базы данных, если вам нужно, чтобы он работал на нескольких машинах
Вы можете записать элементы списка в файл, выполнив следующее
for item in thelist: thefile.write("%s\n" % item)
Comments