Продолжаем работать со списками в Python.
Прежде, чем двигаться дальше, подведем промежуточные итоги.
Напомню, что числовые списки и списки, содержащие объекты различаются по своему «поведению».
Когда вы используете перебор по значению, то не можете изменить элемент списка:
a = [rnd(10) for x in range(12)] print(a) for x in a: x += 1 print(a)
В первом и втором случае мы видим одни и те же значения, потому что x += 1 повлияет только на копию элемента, а не на значение элемента списка.
В то же время «изменение» объектов происходит.
class ball(): def __init__(self): self.x = 10 self.y = 20 a = [ball() for x in range(12)] for b in a: print(b.x, end = ' ') print() for b in a: b.x += 10 for b in a: print(b.x, end = ' ') print()
Причина проста и нет никакой «избирательности».
Операция «=» для простых типов создает еще одну переменную, а для всех остальных (списков, объектов, кортежей, множеств и т.д.) — новое имя. см. Справочник (https://progras.ru/ukazateli-v-python/)
Т.е. перебирать по значениям и изменять список — нельзя.
Но когда вы перебираете список объектов и меняете их координаты, то изменения элементов списка не просиходит! Да, вы изменили значение какого-то свойства объекта, но это для списка не важно и не играет никакой роли — у него какой объект был, такой и остался, потому что список «не знает» ничего о свойства объекта. Он «знает» только адрес, по которому нужно искать объект. А этот адрес не изменился.
Таким образом с числовыми списками работать немного сложнее, чем со списками, которые состоят из объектов, как это ни странно.
Теперь разберем несколько простых задач.
Ваш младший брат тоже решил делать уроки с вами, но немного запутался со списками.
from random import randrange as rnd a = [rnd(10) for x in range(12)] print (a) for i in range(len(a)): s += i print (s)
from random import randrange as rnd a = [rnd(10) for x in range(12)] print (a) s = 0 for i in range(len(a)): if s % 2 == 0: s += i print (s)
from random import randrange as rnd a = [rnd(5) for x in range(15)] print (a) for i in range(len(a)): if a[i] == 0: a.remove(i) print (a)
from random import randrange as rnd a = [rnd(5) for x in range(15)] print (a) for i in range(len(a)): if a[i-1] == 0: a.remove(i) print (a)
from random import choice class ball(): def __init__(self): self.x = 10 self.y = 10 self.color = choice(['red','green']) from random import randrange as rnd a = [ball() for x in range(15)] print (a) for x in a: if a.color == 'red': a.x += 10 print (a)
One thought on “26. Списки в Python. Несколько вопросов”