Я сейчас слежу за "Python Cra sh Course" от Eri c Matthes.
Я добавляю 30 новых предметов в список, используя для l oop. Все предметы являются словарями. Затем я пытаюсь обновить первые несколько элементов списка, используя следующий код (фактический код, размещенный в конце) -
for item in items[0:3]:
if item['someKey'] == 'someValue':
item['someKey'] = 'someOtherValue'
item['someOtherKey'] = 'someDifferentValue'
Итак, поскольку я меняю только первые 3 элемента, он должен меняться только первым 3 предмета. Но это меняет все элементы в списке, если я добавляю в список, используя переменную, объявленную вне для l oop, при добавлении элементов в первую очередь .
#Case-1
items = []
dictionary = {'someKey': 'someValue', 'someOtherKey': 'someOtherValue'}
for item in range(30):
items.append(dictionary)
Если я запустите этот код, а затем запустите для l oop, чтобы обновить некоторые элементы, затем все элементы в списке будут изменены. Разделение списка с помощью [0:3]
не работает!
#Case-2
items = []
for item in range(30):
dictionary = {'someKey': 'someValue', 'someOtherKey': 'someOtherValue'}
items.append(dictionary)
Таким образом, в этом случае процесс обновления работает, как и ожидалось. Для l oop просто обновляются только первые 3 элемента. Почему это происходит? Не имею представления! Список создается в обоих случаях просто отлично . Только при изменении уже созданного списка поведение отличается .
Вот фактический код -
#Case-1
aliens = []
newAlien = {'color': 'green', 'speed': 'slow', 'points': 5}
for alienNumber in range(30):
aliens.append(newAlien)
print(aliens) #Prints the whole list, showing adding dicts went just fine
for alien in aliens[0:3]: #intending change for only first 3 items
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
for alien in aliens[0:5]:
print(alien) #Shows all five items are modified even though intended for first 3
Вот где все прошло хорошо -
#Case-2
aliens = []
for alienNumber in range(30):
newAlien = {'color': 'green', 'speed': 'slow', 'points': 5}
aliens.append(newAlien)
print(aliens) #prints whole list, 30 dicts are added
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
for alien in aliens[0:5]:
print(alien) #Here only first 3 items are modified, as intended
Помогите мне понять поведение for
l oop здесь. Предполагается, что l oop только добавляет предметы и ничего больше. Как объявление нового словаря за пределами для l oop меняет способ изменения элементов , позже ?