Почему я могу изменить список в a для l oop только при использовании скобок? - PullRequest
0 голосов
/ 22 апреля 2020

Когда я использую скобки для item во втором примере, список можно изменить.

list1 = [[1, 2]]

for item in list1:
    item = [88, 88]

print(list1)

-----------------

list2 = [[[1, 2]]]

for item in list2:
    item[0] = [88, 88]

print(list2)

output:

[[1, 2]]   
[[[88, 88]]]  

Я выполнил поиск, чтобы найти, что item это просто временное имя для элемента. Не сам предмет. Так почему же при добавлении [] в "item" сам список можно изменить?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

Прежде всего, я думаю, вы должны прочитать о Итерации в python.

Просто чтобы прояснить ситуацию:

  • list1 = [[1, 2]] означает у вас есть list1, содержащий список, который содержит список [1,2] в list1[0].
  • list2 = [[[1, 2]]] означает, что у вас есть list2, содержащий список [[1, 2]].

Во-вторых, чтобы изменить значение первого элемента в списке, с [1,2] на [88,88], вы можете написать:

list1 = [[1, 2]]

for item in list1:
    item[0] = 88
    item[1] = 88

print(list1)

output:

[[88, 88]]

Теперь давайте объясним:

Для каждой итерации для l oop переменной item присваивается только копия значения элемента в списке, поэтому изменения, внесенные в item, не будут отражены в списке.

Именно поэтому в вашей первой попытке (с list1) при итерации по списку - item = [88, 88] только изменил копию и не фактический список (здесь была копия списка [1,2]).

Во второй попытке, т.е.:

for item in list2:
    item[0] = [88, 88]

Для каждой итерации для l oop, вы получаете доступ item[0], который является копией ссылки на первый элемент в item. Поэтому, когда вы присваиваете ему значение, оно изменяется в списке.

0 голосов
/ 22 апреля 2020

Насколько я понимаю, в первом примере, когда ваша программа проходит через для l oop, она получает значение элемента (будучи [1, 2]), внутри для l oop вы меняете переменную item в [88, 88], фактически не обновляя сам список, а обновляя переменную, содержащую [1, 2].

Во втором примере for для l oop возвращает переменную item как второй список внутри списка2. Когда вы используете квадратные скобки, он получает индекс 0 в этом списке, то есть ищет 0-й элемент в списке, а затем обновляет его до значения [88, 88].

Надеюсь, это поможет.

...