Проблема с присвоением новых значений элементам итератора, использующим для l oop in python - PullRequest
0 голосов
/ 27 апреля 2020

У меня проблема с назначением новых значений элементам итератора, использующим для l oop. скажем, у нас есть этот список:

some_2d_list = [['mean', 'really', 'is', 'jean'],
 ['world', 'my', 'rocks', 'python']]
почему этот код работает и изменяет элементы исходного списка (обращая элементы, которые сами являются списками):

for items in some_2d_list:
        items = items.reverse()

, но это не так (мы будем использовать индексы, чтобы применить изменения в этом случае):

for items in some_2d_list:
        items = ["some new list"]
Я ожидал этого результата с последним кодом:

some_2d_list = [["some new list"],
 ["some new list"]]

1 Ответ

1 голос
/ 27 апреля 2020

list.reverse отменяет на месте и возвращает None, поэтому

for items in some_2d_list:
    items = items.reverse()

отменяет существующий список, который все еще находится в some_2d_list, и назначает None для items.

Когда вы вводите блок кода в for items in some_2d_list, items является ссылкой на объект, все еще в some_2d_list. Все, что изменяет существующий список, также влияет на some_2d_list. например

>>> some_2d_list = [['mean', 'really', 'is', 'jean'],
...  ['world', 'my', 'rocks', 'python']]
>>> 
>>> for items in some_2d_list:
...     items.append('foo')
...     del items[1]
... 
>>> some_2d_list
[['mean', 'is', 'jean', 'foo'], ['world', 'rocks', 'python', 'foo']]

Расширенные операции, такие как "+ =", являются неоднозначными. В зависимости от того, как реализован данный тип, он может обновляться на месте или создавать новые объекты. Они работают для списков

>>> some_2d_list = [['mean', 'really', 'is', 'jean'],
...  ['world', 'my', 'rocks', 'python']]
>>> 
>>> for items in some_2d_list:
...     items += ['bar']
... 
>>> some_2d_list
[['mean', 'really', 'is', 'jean', 'bar'], ['world', 'my', 'rocks', 'python', 'bar']]

, но не для кортежей

>>> some_2d_list = [('mean', 'really', 'is', 'jean'), ('world', 'my', 'rocks', 'python')]
>>> for items in some_2d_list:
...     items += ('baz',)
... 
>>> some_2d_list
[('mean', 'really', 'is', 'jean'), ('world', 'my', 'rocks', 'python')]
...