Содержимое
Python vs C Сегодня я расскажу, почему считаю, что в начале айтишного пути освоение азов Си, на мой взгляд - лучшее, с чего стоит начинать. И что можно упустить, если ограничиться, скажем, одним питоном. Когда я впервые попробовала что-то из программирования - это был небольшой и очень простенький курс по введению в программирование на основе javascript, затем - тоже несложный курс по Python - и, пройдя их, я считала, что уже чему-то научилась. Потом же я случайно набрела на CS50 (ну вы помните, я его все время тут упоминаю). И, начав проходить его (а там как раз дают основы Си), поняла, что я ВООБЩЕ НИЧЕГО НЕ ЗНАЮ, и что этот курс по питону, пройденный мной ранее - это просто смех какой-то, а не курс. Потому что, изучая питон, можно очень сильно прыгать по верхам, ни во что не вникая. Взять, к примеру переменные. Что думает о переменных новичок при знакомстве с Python? Что переменная - это некое имя, скажем, x. И в этом x можно хранить всё что угодно - например, надпись или число, список, dict - и так далее. То есть по сути, переменная - это как бы и есть это число или надпись или другой объект. Что понимаешь о переменных, когда знакомишься с Си? Что за переменными скрывается некая область памяти. В этой памяти хранятся биты информации - то есть последовательность нулей и единиц. В этих битах могут быть закодированы разные типы данных, например, число или буква. Как именно «расшифровать» последовательность ноликов и единиц, определяет тип переменной. Например, мы объявляем переменную типа char (символ) - значит тот байт, что хранится в этом участке памяти скрывает в себе некоторый символ, например, букву. Есть ещё один особый вид переменных - это указатели. В таких переменных не хранятся данные, которые мы будем использовать напрямую - например, буква или число. В них хранится адрес другой «ячейки» в памяти. Для наглядности давайте представим себе почтовые ящики в доме - это будет наша метафора для памяти компьютера. Мы открываем почтовый ящик, и там лежат нужные нам данные - например, газета. Вот так работает обычная переменная в си. А теперь представьте, что вы открываете почтовый ящик, а там записка: «смотрите почтовый ящик номер 38». Вы можете прочитать эту записку, открыть почтовый ящик номер 38 и достать оттуда нужные данные - газету. Переменные-указатели работают примерно как ящик с запиской - хранят адрес нужных данных, но не сами данные. И ещё есть схожее понятие ссылка, не будем тут рассматривать её отличия от указателя, в данном контексте это несущественно. Зачем же питонисту знать про указатели и ссылки? А потому что в Python - любая переменная - это ссылка. Переменные питона напрямую не хранят никаких чисел, букв, текста или других данных. Они хранят только адрес в памяти, из которого можно достать нужные данные. Поэтому можно создать 2 или больше переменных, которые будут ссылаться на один и тот же объект, например, на список. И когда мы меняем этот список - он изменится и во всех переменных, которые на него ссылаются. Потому что эти переменные хранят в себе всего лишь адрес, по которому «живёт» этот список. А вот если мы присваиваем переменной какой-то другой объект, то мы меняем уже сам адрес, на который ссылается эта переменная. То есть, убираем из почтового ящика записку «см. ячейку 38» и кладём туда новую записку - «см. ячейку 42». В Python есть изменяемые и неизменяемые объекты. Упомянутые выши списки - это изменяемые объекты - поэтому, при операциях со списком мы меняем сами данные, но не меняем переменную - она по прежнему ссылается на ту же ячейку памяти. А, например, строка str - это неизменяемый тип - существующую строку изменить нельзя, можно создать новую строку, и записать в переменную адрес этой новой строки. Подобные детали могут ускользнуть от новичка, но без их знания вы гарантированно в итоге будете делать ошибки в коде.