Продолжаем работать со списками в 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. Несколько вопросов”