Почему мой «old_items_list» равен «items_list»?

#python #html

Вопрос:

 def scraping():
    old_items_list = items_list
    x = 0
    for item in items:
        item_price = item.find("span", {"class": "price-text-E1Y7h text-text-LurtD text-size-s-BxGpL"})
        item_url_container = item.find("div", {"class": "iva-item-titleStep-_CxvN"})
        item_url = item_url_container.a["href"]
        item_name_container = item.find("h3", {"class": "title-root-j7cja iva-item-title-_qCwt title-listRedesign-XHq38 title-root_maxHeight-SXHes text-text-LurtD text-size-s-BxGpL text-bold-SinUO"})
        item_name = item_name_container.text

        items_list[x] = item_url
        x  = 1
    print(items_list)
    if items_list == old_items_list:
        return True
    if items_list != old_items_list:
        print('found difference')
        new_items_list = list(set(old_items_list).difference(items_list))
        print(new_items_list)
        for item in new_items_list:
            print(item)



items_list = [1,2,3]
while True:
    scraping()
    print('HUH??')

    sleep(3)
 

Я не понимаю, почему код отображается таким образом, но я надеюсь, что он читаем. Я не упоминаю old_items_list нигде, кроме начала функции, но он все равно меняет свои свойства по мере выполнения функции

Комментарии:

1. Для уценки Stackoverflow требуется 4 пробела для начала блока кода. Это означает, что если вы хотите сделать отступ в 4 пробела, вам нужно сделать отступ в 8 пробелов в редакторе. Вернитесь и начните добавлять 4 пробела к тем строкам, которые вы хотите сделать отступом, и вы увидите, что они начинают выглядеть правильно в отображаемом коде.

2. У вас там много кода, когда на самом деле вас просто волнует обновление списка для этого вопроса. Можете ли вы упростить? Я вижу old_items_list = items_list — это не копирует список. Это означает только то, что эти две переменные ссылаются на один и тот же список.

3. old_items_list = items_list.copy() должно сработать. Как отметил @tdelaney, обе переменные ссылаются на один и тот же список.

4. Спасибо всем вам!!! Решенный. Нужно ли мне удалять сообщение?

5. Молшейп отвечает на ваш вопрос? Если это так, примите это вместо удаления.

Ответ №1:

old_items_list = items_list создает ссылку на items_list . Вы ищете что-то вроде этого:

 original_list = [1, 2, 3]
reference_list = original_list
old_list = original_list.copy()

print(original_list)
original_list.append(4)
print(reference_list)
print(old_list)  # this is what you are looking for
 

Используйте .copy() метод из своего списка, чтобы создать копию исходного списка.

Комментарии:

1. Спасибо! Очень признателен

Ответ №2:

В большинстве распространенных языков при назначении переменных вы назначаете ссылки, на которые указывает значение этой переменной (например, указатели памяти в ссылках на кучное пространство C или java).

Итак, вы можете представить себе предложение «old_items_list = items_list» так же, как:

  1. параметр memory_reference имеет значение [x,y,z]
  2. items_list указывает на memory_reference,поэтому значение является значением,связанным с memory_reference (как мы уже говорили ранее [x, y, z]).
  3. old_items_list указывает на items_list, поэтому обе переменные указывают на одну и ту же ссылку на значения, поэтому мы ссылаемся на одни и те же экземпляры

Чтобы не иметь одинаковых ссылок, вы можете:

  1. Выполните копирование для каждого элемента или в списке, если переменные являются неизменяемыми
  2. Сериализуйте список и десериализуйте его снова в новой переменной, чтобы одни и те же значения указывали на разные места.