Как происходит процесс присваивания в python
Перейти к содержимому

Как происходит процесс присваивания в python

  • автор:

Как происходит процесс присваивания в python

print(value, …, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)

выводит в файл file значение value, добавляя в конце вывода строку end элементы value разделены строкой sep. Если flush=True, тогда после выполнения команды посылается команда очистки буферов ввода/вывода.

value может быть любым объектом python

чаще всего эта функция используется для вывода строковых сообщений.

форматрирование строк

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

%s — подстановка строки

%d — подстановка целого числа

%f — подстановка числа с плавающей точкой

Подстановочные аргументы передаются в строку форматирования с помощью оператора %, за которым следует кортеж с постановочными аргументами.

Функция input

input(prompt=None, /)

Читает строку со стандартного ввода. Символ перевода строки опускается.

Если prompt указан, то он выводится в стандартный вывод без символа перевода строки.

Если пользователь послал сигнал EOF (*nix: Ctrl-D, Windows: Ctrl-Z-Return), вызывает исключение EOFError. На *nix системах используется библиотека readline, если таковая установлена.

Оператор присваивания

Оператор присваивания в Python, как и во многих других языках программирования это = . Поскольку все в Python объекты, операция присваивания копирует ссылку на объект. Это так в случае изменяемых объектов ( array, bytearray, list, dict, set ), однако для неизменяемых, таких как int, float, complex, str, bytes, tuple, frozenset, bool , происходит создание нового объекта.

Циклы

В питоне выделяют два циклических выражения: for и while .

While loop

Выражение while или цикл «пока» имеет следующий вид:

Цикл выполняется, пока logical expression истинно, если условие нарушается, выполняется блок else и осуществляется выход из цикла

For loop

В питоне цикл for используется для прохода всех элементов в последовательности (строка, список, кортеж) или другого итерируемого объекта.

expression_list вычисляется один раз; оно должно вернуть итерируемый объект. Suite выполняется каждый раз для каждого элемента из итератора. Каждый элемент итератора в свою очередь присваивается target_list и затем выполняется suite .

Когда элементы итератора исчерпываются (когда последовательность заканчивается или итератор вызывает StopException исключение), выполняется suite из ветки else и цикл завершается.

Если в теле цикла вызывается break , она завершает цикл, без выполнения ветки else . continue в теле цикла пропускает оставшуюся часть кода до новой итерации или до ветки else , если новой итерации нет.

Цикл for присваивает значения переменным из target_list . Это действие переписывает все предыдущие присваивания переменным, включае те, что были сделаны в теле цикла.

имена из target_list не удаляются по завершении цикла, но если итерируемая последовательность пуста, они не будут инициализированы.

функция range() возвращает итератор, с помощью которого можно с эмулировать работу цикла for в паскале. list(range(5))=[1,2,3,4] .

Если мы итерируем по mutable объекту и нам нужно удалять или вставлять туда элементы, то цикл вида:

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

То же касается и вставки.

Выход из решения — создать временную копию списка, например с помощью сечения.

Здесь мы итерировать будем копию списка, а удалять элементы из оригинала.

ПРИСВАИВАНИЕ И СОЗДАНИЕ ОБЪЕКТОВ В PYTHON

Для присваивания значений переменным в Python служит оператор «=«.

Выражение, стоящее справа от оператора присваивания, вычисляется, и полученное значение присваивается переменной, стоящей слева от оператора присваивания. При этом предыдущее значение, хранящееся в переменной, стирается и заменяется на новое. Если такой переменной не существует, то она создается и в нее записывается значение.

Создание переменных и объектов в Python происходит с помощью оператора присваивания.

Оператор » присвоить переменной a значение 5″.

Cложить значения 5 и 3, результат присвоить переменной x (записать в переменную x).
Прибавить 4 к значению, хранящемуся в переменной a, полученный результат присвоить переменной b (записать в переменную b).
Прибавить 1 к значению, хранящемуся в переменной b, полученный результат присвоить переменной b (записать в переменную b). В результате выполнения этой строчки кода, значение переменной b увеличится на 1.

В правой части значение переменной может использоваться много раз:

Множественное присваивание

Множественное присваивание (позиционное присваивание) в Python реализуется следующим образом: В результате выполнения этой строки кода в переменной a окажется число 5, в переменной b — 3, в переменной c — 1. Количество значений и количество переменных справа и слева от оператора присваивания должно совпадать. При множественном присваивании порядок присваивания формируется слева направо.

С помощью множественного присваивания можно поменять значения переменных между собой.

Множественное присваивание со списками

В переменной a окажется число 5, в переменной b — 3, в переменной c — 1.

Количество переменных должно быть равно количеству элементов списка.

Аналогичным образом это работает и для кортежей.

Множественное присваивание со строками

В a окажется «m», в b — «a», в c — «k», в d — «e».

Количество переменных должно быть равно количеству символов в строке.

Каскадное присваивание

Инициализация переменных

Любая переменная, использующаяся в выражении, должна существовать.

Допустим, мы написали следующую программу: При ее запуске мы получим сообщение об ошибке «NameError: name ‘c’ is not defined» , которое говорит нам, что переменная «c» не определена.

Действительно, переменной «c» в нашей программе не существует и при вычислении выражения a + b + c интерпретатор Python столкнулся с этой проблемой. Попробуем исправить эту ситуацию. Теперь всё нормально и после запуска программы мы получим результат вычислений.

Особенно важно обращать внимание на существование переменной в конструкциях, используемых, например, для счетчиков.

Следующий код вернет ошибку «NameError: name ‘k’ is not defined» . Интерпретатор не сможет вычислить значение выражения k + 1, так как переменная k не определена.

Чтобы код нормально работал, следует создать переменную k, присвоив ей, например, 0. Это называется инициализировать переменную.

Составное присваивание

В составном операторе присваивания используются арифметические операторы.

Пример сложения с присваиванием: Получим Составной оператор += прибавляет к переменной значение выражения справа от оператора присваивания и записывает получившийся результат в эту переменную.

Python. Оператор присваивания. Формы присваивания. Примеры. Позиционное присваивание кортежей, списков

Оператор присваивания. Формы присваивания. Примеры. Позиционное присваивание кортежей, списков

Содержание

  • 1. Назначение оператора присваивания
  • 2. Какие существуют формы инструкции присваивания? Примеры
  • 3. Присваивание одиночных объектов. Общая форма. Примеры
  • 4. Позиционное присваивание кортежей и списков. Общая форма. Принцип выполнения позиционного присваивания
  • 5. Примеры использования оператора присваивания для нескольких имен
  • 6. Позиционное присваивание последовательностей символов. Пример
  • 7. Примеры позиционного присваивания кортежей для обмена их значениями
  • 8. Позиционное присваивание списков. Пример
  • 9. Пример присваивания между кортежами и списками
  • 10. Какие ограничения устанавливаются при присваивании последовательностей?

Поиск на других ресурсах:

1. Назначение оператора присваивания

Оператор присваивания предназначен для связывания имен со значениями и для изменения атрибутов или элементов изменяемых объектов. Оператор присваивания связывает переменную с объектом и набором (списком) объектов. Оператор присваивания обозначается ‘=’ .

2. Какие существуют формы инструкции присваивания? Примеры

В языке Python существуют следующие формы (разновидности) инструкции присваивания:

  • обычная (каноническая) форма. Эта форма связывает одну переменную (один элемент данных) с одним объектом;
  • позиционное присваивание кортежей. В этом случае в левой части присваивания указывается несколько переменных (элементов данных), которые соответствуют такому же количеству объектов в правой части. Значения (объекты) в правой части присваиваются именам (переменным) в левой части, которые размещаются на одних и тех же позициях;
  • позиционное присваивание списков. Работает по принципу позиционного присваивания кортежей, но реализовано для списков;
  • позиционное присваивание последовательностей. В этом случае последовательность находится справа от знака присваивания. Эта последовательность разбивается на подэлементы, каждый из которых присваивается соответствующему имени, указываемому в левой части оператора присваивания;
  • присваивание с использованием операции распаковки * ;
  • присваивание одинарного объекта группе имен;
  • комбинированное присваивание. В этом случае используются операторы += , -= , *= , /= , //= , %= , &= , |= , = , >>= , <<= , **= .
3. Присваивание одиночных объектов. Общая форма. Примеры

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

  • name – имя (переменная), которое нужно связать со значением (объектом) value;
  • value – значение, присваиваемое имени name, которое может быть выражением, одиночным значением или списком.

Также допускается в одной строке выполнять несколько присваиваний одиночным объектам. В этом случае операции присваивания разделяются символом ‘;‘ .

Примеры.

В вышеприведенном примере переменная a связывается с объектом 5. Также переменные b , c , d получают значения соответственно 7, 8, 9. Имя T связывается со списком [1, 2, 4] .

4. Позиционное присваивание кортежей и списков. Общая форма. Принцип выполнения позиционного присваивания

В простейшем случае общая форма позиционного оператора присваивания кортежей имеет вид:

  • name1 , name2 , nameN – имена (переменные) которые нужно связать с объектами (значениями) value1 , value2 , valueN ;
  • value1 , value2 , valueN – значения (объекты), которые связываются с именами name1 , name2 , nameN .

При присваивании нескольких объектов, порядок присваивания формируется слева направо. Имена, которые связываются с перечнем объектов рекурсивно пересматриваются слева направо. Каждому имени в левой части оператора присваивания соотвестсвует объект (значение) в правой части оператора присваивания, который имеет ту же позицию.

После присваивания значения первому имени, это имя уже имеет новое значение при присваивании значения второму имени. Это есть важно. В нижеследующих примерах будет продемонстрирована особенность операции присваивания для нескольких объектов.

5. Примеры использования оператора присваивания для нескольких имен

Пример 1. В нижеследующем коде демонстрируется присваивание значений нескольким объектам.

В вышеприведенном примере при присваивании, строка

благодаря рекурсивному вызову последовательно формируется в две строки

поэтому, в результате список-объект x будет иметь значение

6. Позиционное присваивание последовательностей символов. Пример

Оператор присваивания можно применять для присваивания последовательностей символов. Среди нескольких имен, символ в правой части присваивается имени, позиция которого в левой части совпадает с позицией этого символа.

7. Примеры позиционного присваивания кортежей для обмена их значениями

Пример 1.

В этом примере осуществляется обмен значениями двух кортежей:

В данном примере строка присваивания кортежей

работает следующим образом:

  • сначала создается временный кортеж, который запоминает оригинальные значения a , b справа от операции присваивания. В этом временном кортеже оригинальные значения а’ = 5 , b’ = 7 ;
  • имени a присваивается значение b’ из временного кортежа. То есть a = b’ = 7 ;
  • имени b присваивается значение а’ из временного кортежа. То есть b = а’ = 5 .

Итак, для обмена значениями в Python, не нужно использовать временные переменные для запоминания значений.

Пример 2.

В данном примере в строке

интерпретатор выполняет следующую последовательность действий:

  • создается временный кортеж, в котором имена имеют следующие значения: a=1 , b=2 , c=3 , d=4 ;
  • имя a получает значение d из временного кортежа: a = 4 ;
  • имя b получает значение c из временного кортежа: b = 3 ;
  • имя c получает значение b из временного кортежа. Таким образом c = 2 ;
  • имя d получает значение a из временного кортежа. Ведь d = 1 .
8. Позиционное присваивание списков. Пример

Переменные могут формироваться в списки. Присваивание в списках может быть следующим:

9. Пример присваивания между кортежами и списками

В Python списки и кортежи являются обобщенными. Это значит, что можно присваивать список переменных кортежу и, наоборот, кортеж пеменным списка. В любом случае интерпретатор свяжет элементы последовательности справа с переменными в последовательности слева соответственно их позициям в направления слева направо:

10. Какие ограничения устанавливаются при присваивании последовательностей?

При присваивании последовательностей важно, чтобы обе последовательности имели одинаковое количество элементов. Если количество элементов в последовательностях будет отличаться, то интерпретатор выдаст сообщение об ошибке.

Например.

Если нужно присвоить разное количество элементов, то в Python есть возможность получить срез. Более подробно о срезах описывается в другой теме.

Инструкции присваивания в Python

В Python , как и во многих других языках программирования, каноническая форма операции присваивания имеет вид a = b , где слева от оператора присваивания записывается целевое имя переменной или компонент объекта, а в качестве правого операнда выступает произвольное выражение, которое в результате вычислений дает объект (см. пример №1 ).

Пример №1. Каноническая форма присваивания.

Как видим, присваивание действительно выполняется достаточно просто. Однако при этом хотелось бы обратить внимание на следующие особенности присваивания в Python :

  • Инструкции присваивания всегда сохраняют ссылки на объекты, например, в переменных или в элементах структур данных, и никогда не создают копии присваиваемых объектов. Как следствие, переменные в Python больше напоминают указатели, чем области хранения данных.
  • Объявлять переменные заранее нельзя, т.к. интерпретатор создает переменные в момент присваивания им значений (то есть ссылок на объекты). После инициализации, когда имя переменной будет встречаться в выражениях, оно будет автоматически замещаться объектом, на который ссылается данная переменная. Если же интерпретатор встретит в программе неинициализированную переменную, он возбудит исключение вместо того, чтобы вернуть какое-либо значение по умолчанию (такое поведение призвано облегчить поиск ошибок и опечаток в коде).
  • Некоторые инструкции пусть и неявно, но тоже выполняют операцию присваивания. Примерами могут служить импорт модуля, определение функции или класса, указание переменной в цикле for или же передача аргументов функции. В любом случае результатом явных или неявных инструкций присваивания будет связывание имен с ссылками на объекты.

Ну, и в конце пункта еще раз напомним, что в программировании знак равно ( = ) обычно означает не равенство двух величин, а присваивание значения переменной. Если же нужно указать на равенство двух значений, то используется комбинация символов из двух знаков равно ( == ).

Комбинированные инструкции присваивания

В дополнение к базовой инструкции присваивания в Python имеется и целый ряд комбинированных инструкций присваивания, которые объединяют операцию присваивания с другой операцией. В общем виде инструкцию присваивания с комбинированным оператором x operator= y можно считать сокращенной записью инструкции x = x operator y . Например, x += y является сокращенной записью инструкции присваивания x = x + y , в которой к значению переменной x прибавляется значение переменной y , а результат присваивается переменной x (см. пример №2 ).

Пример №2. Комбинированная форма присваивания.

Таким образом, комбинированная инструкция присваивания объединяет в себе выражение и присваивание, являясь по сути краткой формой записи кода. И хотя, например, инструкции num += 25 и num = num + 25 дадут один и тот же результат, первая из них выглядит явно компактнее. Кроме того, если объект справа относится к категории изменяемых объектов и поддерживает указанную операцию, комбинированная инструкция присваивания может выполняться даже быстрее за счет непосредственного изменения объекта вместо создания и изменения его копии (см. пример №3 ).

Пример №3. Преимущества комбинированной формы присваивания.

Метод time() одноименного модуля time стандартной библиотеки Python возвращает время, выраженное в секундах с начала эпохи. В операционных системах Unix , например, за начало эпохи принимается 1 января 1970 , 00 : 00 : 00 ( UTC ). Но поскольку в программах в основном используются интервалы времени между двумя событиями, а не время, прошедшее с начала эпохи, знать дату начала эпохи какой-либо конкретной операционной системы вовсе необязательно, т.к. разница между двумя временными точками для всех платформ получается совершенно одинаковой.

Давайте еще раз и в одном месте перечислим основные инструкции присваивания, комбинированные с арифметическими операторами:

  • a += b – тоже самое, что и a = a + b ;
  • a -= b – тоже самое, что и a = a — b ;
  • a *= b – тоже самое, что и a = a * b ;
  • a **= b – тоже самое, что и a = a**b ;
  • a /= b – тоже самое, что и a = a / b ;
  • a //= b – тоже самое, что и a = a // b ;
  • a %= b – тоже самое, что и a = a % b .

Позиционное присваивание

Еще одной формой присваивания в Python является , которое связывает объекты последовательностей справа от оператора присваивания с именами, перечисляемыми слева от него. При этом присваивание выполняется слева направо согласно местоположениям имен и соответствующих им объектов (см. пример №4 ).

Пример №4. Позиционное присваивание (часть 1).

Как видим, данная форма присваивания позволяет смешивать последовательности разных типов. Здесь главное, чтобы количество присваиваемых значений совпадало с количеством переменных, которым эти значения будут присваиваться. Но и эта проблема может быть решена за счет имеющейся возможности использования в присваивании расширенного синтакиса распаковывания последовательностей (см. пример №5 ).

Пример №5. Позиционное присваивание (часть 2).

Благодаря наличию имени со звездочкой все лишние значения автоматически помещаются в соответсвующий список именно так, как и ожидается. Однако нужно не забывать, что можно использовать только одну переменную со звездочкой, а сама переменная должна принадлежать последовательности даже в том случае, если она будет одна (поставив запятую в инструкции *c, = [1, 2] мы автоматически получили кортеж и смогли избежать ошибки).

Следует добавить, что расширенная операция распаковывания последовательностей может использоваться не только в случаях явного присваивания значений, но также и в заголовках циклов, вызовах функций и других операциях неявного присваивания значений.

Групповое присваивание одного значения

В случае группового присваивания объект, расположенный справа, присваивается всем переменным группы (см. пример №6 ). В результате несколько отдельных инструкций присваивания могут быть заменены одной эквивалентной и более компактной инструкцией.

Пример №6. Присваивание одного значения группе переменных (часть 1).

Следует иметь в виду, что при групповом присваивании в памяти создается всего лишь один объект, разделяемый всеми переменными группы. Поэтому такая форма присваивания будет полезна для неизменяемых объектов, например, чисел или строк. А вот при использовании изменяемых объектов типа списков или словарей нужно быть осторожными, т.к. изменение объекта через одну из переменных группы будет оказывать влияние и на другие переменные (см. пример №7 ). Это связано с тем, что переменные в Python хранят не сами объекты, а ссылки на них. А раз так, то даже после изменения объекта через одну из ссылок все остальные по-прежнему будут указывать на тот же, пусть и модифицированный, объект.

Пример №7. Присваивание одного значения группе переменных (часть 2).

Таким образом, во избежание проблем с изменяемыми объектами, их инициализацию лучше производить в отдельных инструкциях, как было показано в первой части примера №6 .

Выражения присваивания в Python

Все рассмотренные нами формы присваивания относятся к инструкциям. Но их запрещено использовать в выражениях, что иногда может быть весьма полезным. Поэтому начиная с версии Python 3.8 было решено ввести новую конструкцию NAME := expr с возможностью использования в выражениях (см. пример №8 ). Конструкция получила название или же , а оператор := стал неофициально называться .

Пример №8. Использование выражений присваивания (часть 1).

Использовать выражение присваивания в коде верхнего уровня без скобок запрещается. Например, инструкция x = y := 5 не пройдет, нужно использовать скобки: x = (y := 5) . И вообще, использование скобок с моржовым оператором следует сразу же взять на вооружение, т.к. это поможет избежать многих досадных ошибок.

Возможно, кто-то сочтет такое нововведение нецелесообразным, ведь выражения порой и так бывают довольно громоздкими, чтобы вводить туда еще и дополнительные конструкции с набором ограничений. Но ситуации бывают разные как, например, в примере №9 .

Пример №9. Использование выражений присваивания (часть 2).

Подробнее о выражениях присваивания можете почитать на официальном сайте в документации к PEP 572 – Assignment Expressions.

Краткие итоги параграфа

  • В Python инструкции присваивания всегда сохраняют ссылки на объекты, например, в переменных или в элементах структур данных, и никогда не создают копии присваиваемых объектов.
  • Классическая форма присваивания имеет вид NAME = expr , что соответствует синтаксису многих других языков программирования. Однако в Python доступны и другие формы инструкций присваивания: комбинированные инструкции присваивания (например, y **= 3 ), позиционное присваивание (например, x, y = [3, 5] или x, *y = ‘abcdef’ ), а также групповое присваивание одного значения (например, a = b = c = 33 ).
  • При групповом присваивании одного значения в памяти создается всего лишь один объект, разделяемый всеми переменными группы. Поэтому такая форма присваивания будет полезна для неизменяемых объектов, например, чисел или строк. А вот при использовании изменяемых объектов типа списков или словарей нужно быть осторожными, т.к. изменение объекта через одну из переменных группы будет оказывать влияние и на другие переменные.
  • Поскольку в Python запрещается использовать инструкции в выражениях, начиная с версии 3.8 была введена специальная конструкция NAME := expr , получившая название выражения присваивания и предназначенная для присваивания значений внутри выражений, например, a = (b := 3) + (c := 5) .

Вопросы и задания для самоконтроля

1. Перечислите основные формы инструкций присваивания в Python . Показать решение.

Ответ. Классическая форма NAME = expr , комбинированные инструкции присваивания NAME operator= expr , позиционное присваивание NAME_1, . NAME_n = expr_1, . expr_n , а также групповое присваивание одного значения NAME_1 = . = NAME_n = expr .

2. Имеются две инициализированные переменные a = ‘one’ и b = ‘two’ . Поменяйте значения переменных местами, использовав позиционную форму инструкции присваивания. Показать решение.

Ответ. Так как в процессе позиционного присваивания интерпретатор создает временный кортеж, где сохраняются оригинальные значения переменных справа, данная форма присваивания может использоваться для реализации обмена значений переменных без создания временной переменной. Таким образом, кортеж справа автоматически запоминает предыдущие значения переменных.

3. О чем следует помнить, когда трем переменным присваивается один и тот же изменяемый объект? Показать решение.

Ответ. Если, например, выполнить присваивание следующим образом: a = b = c = [] , то все три переменные будут ссылаться на один и тот же объект. Поэтому непосредственное изменение объекта с помощью одной переменной (например, A.append(5) ) отразится и на других. Однако это справедливо только для изменений, производимых непосредственно в изменяемых объектах, таких как списки или словари. Для неизменяемых объектов, вроде чисел и строк, такой проблемы не возникает.

4. Какие из представленных фрагментов кода содержат ошибки: a, b = [3, ‘3’] ; x, *y = 1, 2, 3 ; *x, = 1, 2, 3 ; *x, y, *z = 1, 2, 3, 4 ? Объясните ответ. Показать решение.

Ответ. Все фрагменты кода, кроме последнего, верны. А вот последняя инструкция содержит две переменные со звездочкой, что расширенным синтаксисом распаковывания последовательностей не допускается.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *