Предыдущие значения словаря в списке python изменяются при добавлении нового элемента в список [duplicate]

Обратите внимание на класс «MAIN», в который помещается элемент, например

<div class="container">
     <ul class="select">
         <li> First</li>
         <li>Second</li>
    </ul>
</div>

. В приведенном выше сценарии объект MAIN, который будет наблюдать jQuery, является «контейнером».

Тогда вы в основном будете иметь имена элементов в контейнере, такие как ul, li и select:

$(document).ready(function(e) {
    $('.container').on( 'click',".select", function(e) {
        alert("CLICKED");
    });
 });
4
задан ShadowRanger 7 April 2017 в 13:45
поделиться

2 ответа

Это потому, что оба list и list2 относятся к тому же списку после выполнения задания list2=list.

Попробуйте это, чтобы увидеть, относятся ли они к тем же объектам или другим:

id(list)
id(list2)

Пример:

>>> list = [1, 2, 3, 4, 5]
>>> list2 = list
>>> id(list)
140496700844944
>>> id(list2)
140496700844944
>>> list.remove(3)
>>> list
[1, 2, 4, 5]
>>> list2
[1, 2, 4, 5]

Если вы действительно хотите создать дублируемую копию list, чтобы list2 не ссылался на исходный список, но копия списка, используйте оператор среза:

list2 = list[:]

Пример:

>>> list
[1, 2, 4, 5]
>>> list2
[1, 2, 4, 5]
>>> list = [1, 2, 3, 4, 5]
>>> list2 = list[:]
>>> id(list)
140496701034792
>>> id(list2)
140496701034864
>>> list.remove(3)
>>> list
[1, 2, 4, 5]
>>> list2
[1, 2, 3, 4, 5]

Кроме того, не используйте list как имя переменной, потому что изначально , list относится к списку типов, но, определяя вашу собственную переменную list, вы скрываете исходный list, который относится к списку типов. Пример:

>>> list
<type 'list'>
>>> type(list)
<type 'type'>
>>> list = [1, 2, 3, 4, 5]
>>> list
[1, 2, 3, 4, 5]
>>> type(list)
<type 'list'>
5
ответ дан Susam Pal 18 August 2018 в 07:02
поделиться

Причина, по которой это происходит, можно найти здесь:

mlist = [1,2,3,4,5]
mlist2 = mlist

второй оператор «указывает» mlist2 на mlist (т. е. оба они относятся к одному ), и любые изменения, внесенные вами в один, отражаются в другом.

Чтобы сделать копию вместо этого попробуйте это (используя операцию среза):

mlist = [1,2,3,4,5]
mlist2 = mlist[:]

Если вам любопытно о нотации среза, этот SO-вопрос Списки Python (Slice метод даст вам больше фона.

Наконец , не рекомендуется использовать list в качестве идентификатора, поскольку Python уже использует этот идентификатор для своего собственная структура данных (по этой причине я добавил «m» перед именами переменных)

14
ответ дан Community 18 August 2018 в 07:02
поделиться
  • 1
    Потрясающие! Я смутно вспоминаю чтение переменных, указывающих на один и тот же объект, и задаюсь вопросом, о чем шла речь. Теперь я знаю. – user1604149 16 August 2012 в 20:21
  • 2
    @ user1604149 Да, это то, что вам нужно знать и принимать во внимание. Рад, что мой ответ помог. – Levon 16 August 2012 в 20:22
  • 3
    Это также интересная проблема, потому что объект списка изменяется, поскольку он повторяется, и я думаю (?) Приводит к неопределенному поведению ... – mgilson 16 August 2012 в 20:47
  • 4
    @mgilson Это была моя первая мысль, когда я это увидел, но я думаю, что в основе этой проблемы, которую OP опубликовал (нижние строки), является то, что две вещи относятся к одному и тому же объекту. – Levon 16 August 2012 в 20:49
  • 5
    @Levon - Ты прав. Две переменные, ссылающиеся на один и тот же объект, определенно являются основной причиной здесь. (Исправьте это, и вторая проблема тоже исчезнет). Я просто подумал, что проблема стала немного более интересной / запутанной :-) – mgilson 16 August 2012 в 20:52
Другие вопросы по тегам:

Похожие вопросы: