jasonharper в комментариях прав насчет проблемы, и LearningNoob в основном имеет правильное решение (с незначительными изменениями), но я решил, что стоит опубликовать, чтобы предоставить полную картину.
def_list
являетсясписок определен во внешней области и предназначен для хранения def_dict
словарей.def_dict
определено прямо под ним: неясно, для чего это нужно немедленно, но внутри MethodA
мы можем видеть, что def_dict
представляется контейнером с ключом Description
со значением, основанным натекст в <div>
элементах определенного класса.
В MethodA
мы используем серию методов, чтобы найти <div>
, которые соответствуют определенным критериям.Когда мы находим его, мы создаем новый def_dict
:
def_dict = {'Description': div_text.text.replace("\n", "")}
Поскольку мы присваиваем переменной def_dict
во внутренней области видимости, этот новый объект (инициализируется с помощью {}
) фактически имеет приоритет над def_dict
, определенным во внешней области: в памяти есть два экземпляра словаря - во внешней области, начальный пустой экземпляр словаря по-прежнему назначается def_dict
, находясь во внутренней области def_dict
теперь ссылается на словарь {'Description': div_text.text.replace("\n", "")}
.
Этот второй экземпляр, следовательно, добавляется к def_list
.Поскольку def_list
не было назначено во внутренней области, это все тот же экземпляр списка, который мы инициализировали во внешней области.
Когда мы возвращаемся во внешнюю область, мы обнаруживаем, что ссылки на def_list
и def_dict
никогда не менялись в этих областях, однако def_list
по-прежнему содержит ссылки на все def_list
экземпляры, которые мы создали в MethodA
.Поэтому def_list
печатает список def_dict
s, инициализированных, когда мы запускали MethodA
, и def_dict
печатает пустой (потому что ничего к нему не было добавлено).
Насколько я знаюМожно сказать, нет смысла определять, какое def_dict
(из бесконечного числа def_dicts
, которое MethodA
может инициализировать) должно указываться ссылкой во внешней области видимости, поэтому я 'Я не уверен, почему важно, чтобы def_dict
возвращал пустое значение или возвращал произвольный элемент def_list
.
Принимая во внимание причину, по которой решение LearningNoob возвращает None
, скорее всего,эти строки прямо здесь:
def MethodA(className, url_link):
try:
for div_tag in url_link.find_all('div'):
[etc]
return def_dict
except:
def_dict = None
Во время итерации MethodA
for div_tag in url_link:
в какой-то момент это, вероятно, дает сбой.Когда это происходит, вызывается предложение except
и неявно возвращается None
.Поэтому, если вы выполните одно из следующих действий:
def_list = MethodA(*args,**kw)
## or
print(MethodA(*args,**kw))
Результат будет None
.