Списки — изменяемые последовательности. Урок 10

Основы программирования на Python

Списки в языке программирования Python, как и строки, являются упорядоченными последовательностями. Однако, в отличии от строк, списки состоят не из символов, а из различных объектов (значений, данных), и заключаются не в кавычки, а в квадратные скобки [ ]. Объекты отделяются друг от друга с помощью запятой.

Списки могут состоять из различных объектов: чисел, строк и даже других списков. В последнем случае, списки называют вложенными.

[23, 656, -20, 67, -45]   # список целых чисел
[4.15, 5.93, 6.45, 9.3, 10.0, 11.6]   # список из дробных чисел
["Katy", "Sergei", "Oleg", "Dasha"]   # список из строк
["Москва", "Титова", 12, 148]   # смешанный список
[[0, 0, 0], [0, 0, 1], [0, 1, 0]]   # список, состоящий из списков

Как и над строками над списками можно выполнять операции соединения и повторения:

>>> [45, -12, 'april'] + [21, 48.5, 33]
[45, -12, 'april', 21, 48.5, 33]
>>> [[0,0],[0,1],[1,1]] * 2
[[0, 0], [0, 1], [1, 1], [0, 0], [0, 1], [1, 1]]
>>> 

По аналогии с символами строк, можно получать доступ к объектам списка по их индексам, извлекать срезы, измерять длину списка:

>>> li = ['a','b','c','d','e','f']
>>> len(li)
6
>>> li[0]
'a'
>>> li[4]
'e'
>>> li[0:3]
['a', 'b', 'c']
>>> li[3:]
['d', 'e', 'f']
>>> 

В отличии от строк, списки — это изменяемые последовательности. Если представить строку как объект в памяти, то когда над ней выполняются операции конкатенации и повторения, то это строка не меняется, а в результате операции создается другая строка в другом месте памяти. В строку нельзя добавить новый символ или удалить существующий, не создав при этом новой строки. Со списком дело обстоит иначе. При выполнении операций другие списки могут не создаваться, а изменяться непосредственно оригинал. Из списков можно удалять элементы, добавлять новые. При этом следует помнить, многое зависит от того, как вы распоряжаетесь переменными. Бывают ситуации, когда списки все-таки копируются. Например, результат операции присваивается другой переменной.

Символ в строке изменить нельзя, элемент списка — можно:

>>> mystr = 'abrakadabra'
>>> mylist = ['ab','ra','ka','da','bra']
>>> mystr[3] = '0'
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    mystr[3] = '0'
TypeError: 'str' object does not support item assignment
>>> mylist[1] = 'ro'
>>> mylist
['ab', 'ro', 'ka', 'da', 'bra']
>>> 

В списке можно заменить целый срез:

>>> mylist[0:2] = [10,20]
>>> mylist
[10, 20, 'ka', 'da', 'bra']
>>> 

Более сложная ситуация:

>>> alist = mylist[0:2] + [100,'it is ',200] + mylist[2:] # новый список
>>> a2list = mylist # создается вторая ссылка-переменная на первый список
>>> alist
[10, 20, 100, 'it is ', 200, 'ka', 'da', 'bra'] 
>>> a2list
[10, 20, 'ka', 'da', 'bra']
>>> a2list[0] = '!!!' # изменяем список
>>> a2list
['!!!', 20, 'ka', 'da', 'bra']
>>> mylist # обе переменные связаны с одним списком
['!!!', 20, 'ka', 'da', 'bra']
>>> 

Практическая работа

  1. Создайте два любых списка и свяжите их с переменными.
  2. Извлеките из первого списка второй элемент.
  3. Измените во втором списке последний объект. Выведите список на экран.
  4. Соедините оба списка в один, присвоив результат новой переменной. Выведите получившийся список на экран.
  5. "Снимите" срез из соединенного списка так, чтобы туда попали некоторые части обоих первых списков. Срез свяжите с очередной новой переменной. Выведите значение этой переменной.
  6. Добавьте в список-срез два новых элемента и снова выведите его.

Пример выполнения практической работы

Работа со списками в Python

Доброго времени суток! Не

Доброго времени суток!
Не подскажите куда пропал 9ый урок?

sp1=[15,30,54,11,66,90,34,85,

sp1=[15,30,54,11,66,90,34,85,19,44]
sp2=[18,69,94,58,87,21,56,88,14,38]
print "первый список: ",sp1
print "второй список: ",sp2
как то так вышло
a=sp1
b=sp2
print a[1]
print "введите новое значение последнего числа первого списка: "
a[-1]=int(input())
print "измененный первый список: ",a
spsum=a+b
print "соединяем первый и второй списки: ",spsum
srezspsum=spsum[0:5]+spsum[10:-5]
print "срез : ",srezspsum
print "введите новое значение последнего числа среза: "
srezspsum[-1]=int(input())
print "введите новое значение первого числа среза: "
srezspsum[0]=int(input())
print "срез изменен: ",srezspsum

Мой вариант кода: name =

Мой вариант кода:

name = raw_input("Please enter your name: ")
surname = raw_input("Please enter your surname: ")
fathername = raw_input("Please enter your fathername: ")
 
 
fio = [name] + [surname] + [fathername]
print 'Your surname is' + ' ' + fio[1]
listmessage = ["Your", "full", "fio"]
mesfio1 = listmessage + fio
print mesfio1
 
country = raw_input("Please enter your Country: ")
state = raw_input("Please enter your State: ")
checkstate="Crimea"
while state != checkstate:
    state = raw_input("Fail! Please re-enter your State: ")
city = raw_input("Please enter your City: ")
street = raw_input("Please enter your Street: ")
flat = raw_input("Please enter your # of flat: ")
adress = [country] + [state] + [city] + [street] + [flat]
print 'Your 2nd list is ADRESS:' + ' ' + adress[0] + ' ' + adress[1] + ' ' + adress[2] + ' ' + adress[3] 
 
 
addresschange = raw_input("Please change your # of flat: ")
print addresschange
newadress = adress[:4] + [addresschange]
general = fio + newadress
print general
print 'Your FIO and ADRESS Sir:' + ' ' + fio[0]+ ' ' +fio[1]+ ' ' +fio[2]+ ' ' +adress[0]+ ' ' +adress[1]+ ' ' +adress[2]+ ' ' +adress[3]+ ' ' +newadress[4
                                                                                                                                                          ]
 
generalsrez = general[::2]
print generalsrez
<python>

Более сложная ситуация:>>>

Более сложная ситуация:

>>> alist = mylist[0:2] + [100,'it is ',200] + mylist[2:] # новый список
>>> a2list = mylist # создается вторая ссылка-переменная на первый список
>>> alist
[10, 20, 100, 'it is ', 200, 'ka', 'da', 'bra'] 
>>> a2list
[10, 20, 'ka', 'da', 'bra']
>>> a2list[0] = '!!!' # изменяем список
>>> a2list
['!!!', 20, 'ka', 'da', 'bra']
>>> mylist # обе переменные связаны с одним списком
['!!!', 20, 'ka', 'da', 'bra']
>>>

_________________________________________________________________________

Проверил - действительно работает. А почему работает, не понимаю!
"#обе переменные связаны с одним списком" - Как? Почему?
Объясните, пожалуйста, в каком месте mylist становится идентичным a2list ?

mylist - это ссылка на

mylist - это ссылка на область памяти, где находится список.
Когда выполняется выражение a2list = mylist, то a2list присваивается вовсе не список, а ссылка на область памяти. Получается, что обе переменные ссылаются на одну и туже область, которую могут изменять.

Совсем по иному в Питоне обстоит дело с числами и строками, т.к. они считаются не изменяемыми объектами. Если бы mylist была присвоена строка, то при выполнении выражения a2list = mylist сначала создавалась бы копия значения (строки) в новом месте памяти, а потом ссылка на эту новую область присваивалась бы a2list. В таком случае переменные ссылалась бы на разные объекты.

Но когда мы имеем дело со списками и словарями, то копируются и присваиваются именно ссылки на области памяти, а не значения. Это связано с экономией памяти, т.к. списки могут быть очень большими и копировать их в памяти несколько раз накладно.

Если требуется получить все-таки копию списка, то можно получить срез со всего списка (взятый срез записывается в отдельную область памяти), а потом присвоить ссылку на этот новый объект переменной:
a2list = mylist[:]

Добрый день. Объясните

Добрый день.

Объясните пожалуйста, мне не совсем понятны следующие действия:

mylist = [10, 20, 'ka', 'da', 'bra']
alist = mylist[0:2] + [100,'it is ',200] + mylist[2:]
a2list = mylist
a2list[0] = '!!!' 

почему значение первого объекта в mylist и a2list изменяют значение с 10 на !!!, а в alist первое значение всё равно остается 10?

Списки обладают особенностью.

Списки обладают особенностью. Когда происходит присваивание одного списка другому типа a2list = mylist, то второго списка не создается. Обе ссылки (a2list и mylist) указывают на один и тот же список в памяти.

Если хотят скопировать список, то часто используют срез. Например,

a = [1,2,3]
b = a[0:]

Здесь оба списка содержат числа 1, 2, 3. Но это разные списки. Если бы было a = b, то обе переменные ссылались на один список. И если изменять его через одну, то изменения можно увидеть и через другую.

alist здесь - это уже другой список в памяти. Поэтому когда через a2list меняют первый элемент, то эти изменения видны через mylist, так как эта переменная ссылается на тот же список, что и a2list. alist к этому списку не имеет никакого отношения, т.к. ссылается на другой список.

спасибо! очень большое)

спасибо! очень большое)

Огромное спасибо за Ваш

Огромное спасибо за Ваш труд!
Всё понял. Вы прекрасно объясняете. А в большинстве учебников объяснения столь обобщены и непедагогичны, что хочется попросить объяснить объяснение.
Ещё раз спасибо.