М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 89
Текст из файла (страница 89)
Как всегда в случае использования разделяемых ссылок, различия в поведении этих операций могут иметь значение, если имеются другие ссылки наизменяемый объект:>>> L = [1, 2]>>> M = L>>> L = L + [3, 4]>>> L, M([1, 2, 3, 4], [1,# L и M ссылаются на один и тот же объект# Операция конкатенации создает новый объект# Изменяется L, но не M2])>>> L = [1, 2]>>> M = L>>> L += [3, 4]# Операция += предполагает вызов метода extend>>> L, M# Значение M тоже изменилось!([1, 2, 3, 4], [1, 2, 3, 4])Все это имеет значение только для изменяемых объектов, таких как спискии словари, и к тому же это не совсем ясный случай (по крайней мере, пока еговлияние не скажется на вашем программном коде!).
Если вам требуется избежать создания системы разделяемых ссылок, создавайте копии изменяемыхобъектов.Правила именования переменныхТеперь, когда мы исследовали инструкции присваивания, настало время болееформально подойти к вопросу выбора имен переменных. В языке Python имена появляются в момент, когда им присваиваются некоторые значения, однако существует несколько правил, которым желательно следовать при выбореимен для всего сущего в ваших программах:356Глава 11.
Присваивание, выражения и printСинтаксис: (символ подчеркивания или алфавитный символ) + (любое числосимволов, цифр или символов подчеркивания)Имена переменных должны начинаться с символа подчеркивания или с алфавитного символа, за которым может следовать произвольное число алфавитных символов, цифр или символов подчеркивания. Допустимыми именами являются: _spam, spam и Spam_1, а 1_Spam, spam$ и @#! – недопустимыми.Регистр символов в именах имеет значение: имена SPAM и spam считаются различнымиВ языке Python регистр символов всегда принимается во внимание, какв именах, которые вы создаете, так и в зарезервированных словах. Например, имена X и x – это две разные переменные.
Для обеспечения переносимости регистр символов учитывается и в именах импортируемых модулей,даже на платформах, где файловые системы не учитывают регистр символов.Запрещено использовать зарезервированные словаИмена определяемых вами переменных не могут совпадать с зарезервированными словами, имеющими в языке Python специальное назначение. Например, если попытаться использовать переменную с именем class, интерпретатор выведет сообщение о синтаксической ошибке, однако имена klassи Class являются вполне допустимыми.
В табл. 11.3 перечислены слова, которые в настоящее время зарезервированы языком Python (и, следовательно, запрещены для использования в качестве имен переменных).Таблица 11.3. Зарезервированные слова в версии Python 3.0FalseclassfinallyisreturnNonecontinueforlambdatryTruedeffromnonlocalwhileanddelglobalnotwithaselififoryieldassertelseimportpassbreakexceptinraiseВ табл. 11.3 приводятся слова, зарезервированные в версии Python���������������������������� 3.0. В ���Python 2.6 набор зарезервированных слов немного отличается:•• print – это зарезервированное слово, потому что оно соответствует инструкции вывода, а не встроенной функции (подробнее об этом рассказываетсяниже в этой главе).•• exec – это зарезервированное слово, потому что оно соответствует инструкции, а не встроенной функции.•• nonlocal – не является зарезервированным словом, потому что эта инструкция недоступна в версии 2.6.В более ранних версиях ��������������������������������������������������Python��������������������������������������������ситуация с зарезервированными словами складывалась почти так же, с небольшими отклонениями:357Инструкции присваивания•• with и as не были зарезервированными словами до версии �������������������Python������������� 2.6, в которой впервые официально появились менеджеры контекста.•• yield не было зарезервированным словом до версии Python 2.3, в которойвпервые появились функции-генераторы.•• В версии 2.5 инструкция yield была преобразована в выражение, но не стала встроенной функцией, а осталась зарезервированным словом.В большинстве своем, зарезервированные слова языка Python записываютсясимволами нижнего регистра, и они действительно зарезервированы – в отличие от имен в области видимости по умолчанию, о которой будет рассказываться в следующей части книги, вы не можете переопределять зарезервированныеслова посредством операции присваивания (например, and = 1 приведет к появлению ошибки).1Кроме того, что первые три зарезервированных слова в табл. 11.3, True, Falseи None, записываются символами разных регистров, они еще имеют не совсемобычное назначение – они определены в области видимости по умолчанию,о которой рассказывается в главе 17, и с технической точки зрения являютсяименами переменных, которым присвоены объекты.
Однако во всех остальныхсмыслах они являются зарезервированными словами и не могут использоваться для других целей, кроме как представлять присвоенные им объекты. Всеостальные зарезервированные слова являются частью синтаксиса языка ���Python и могут появляться только в определенном контексте.Кроме того, поскольку имена модулей в инструкции import становятся переменными в ваших сценариях, это накладывает ограничения на имена файловс модулями.
Вы можете создать файлы с именами and.py и my-code.py, но вы несможете импортировать их, потому что их имена без расширения «.py» в программном коде будут преобразованы в имена переменных и поэтому должныследовать только что обозначенным правилам (зарезервированные слова запрещены, а символы дефиса являются недопустимыми, хотя можно использоватьсимволы подчеркивания). Мы еще вернемся к этой теме в пятой части книги.Правила внесения измененийБудет интересно отметить, насколько постепенно и поэтапно вносятсяизменения в перечень зарезервированных слов языка. Когда появляетсякакая-нибудь новая особенность, которая может отрицательно сказатьсяна работоспособности существующих программ, она обычно сначала вводится как необязательная, а в интерпретатор встраивается вывод предупреждения об использовании «нерекомендуемой» возможности, котороедействует на протяжении одного или более выпусков, прежде чем новаявозможность официально будет включена в состав языка.1Тем не менее в Jython, реализации Python на языке Java, имена пользовательскихпеременных иногда могут совпадать с зарезервированными словами языка Python.Краткий обзор Jython приводится в главе 2.358Глава 11.
Присваивание, выражения и printИдея состоит в том, чтобы дать пользователям достаточное время, чтобыобратить внимание на предупреждения и внести изменения в программыперед переходом на использование новой версии интерпретатора. Это неотносится к случаям, когда выходит новая версия со следующим основным номером, такая как 3.0 (в таких случаях обратная совместимостьс существующими программами не гарантируется без всяких предупреждений), но это справедливо для всех остальных случаев.Например, слово yield было необязательным расширением в версииPython 2.2, но, начиная с версии 2.3, оно стало стандартным зарезервированным словом.
Оно используется совместно с функциямигенераторами. Это один из небольшого числа элементов языка, в котором была нарушена обратная совместимость с прежними версиями. Приэтом отношение к использованию слова yield менялось поэтапно – в версии 2.2 при его использовании генерировалось предупреждение, и онобыло недопустимым до версии 2.3.Похожим образом в Python 2.6 появились новые зарезервированныеслова with и as для использования в менеджерах контекстов (новая форма обработки исключений).
В версии 2.5 эти слова не считаются зарезервированными, пока менеджер контекстов не будет включен вручнуюс помощью инструкции импортирования from__future__ (подробностиприводятся ниже в этой книге). При использовании в версии 2.5 словаwith и as вызывают появление предупреждений о грядущих изменениях – исключение составляет версия IDLE в Python 2.5, где эта особенность включается автоматически (то есть использование этих слов в качестве имен переменных в версии 2.5 будет вызывать ошибку, но тольков интерфейсе IDLE).Соглашения по именованиюПомимо указанных правил существует еще целый ряд соглашений – правил,которые не являются обязательными, но которым обычно следуют на практике. Например, имена с двумя символами подчеркивания в начале и в конце(например, __name__) обычно имеют особый смысл для интерпретатора, поэтому вам следует избегать их использования для именования своих переменных.Ниже приводится список соглашений, которым было бы желательно следовать:•• Имена, начинающиеся с одного символа подчеркивания (_X), не импортируются инструкцией from module import * (описывается в главе 22).•• Имена, имеющие два символа подчеркивания в начале и в конце (__X__),являются системными именами, которые имеют особый смысл для интерпретатора.•• Имена, начинающиеся с двух символов подчеркивания и не оканчивающиеся двумя символами подчеркивания (__X), являются локальными («искаженными») для объемлющего класса (смотрите обсуждение псевдочастныхатрибутов в главе 30).•• Имя, состоящее из единственного символа подчеркивания (_), хранит результат последнего выражения при работе в интерактивной оболочке.359Инструкции присваиванияВ дополнение к этим соглашениям существует еще ряд других соглашений,которым обычно стремятся следовать программисты.
Например, далее в книге мы увидим, что имена классов обычно начинаются с заглавного символа,а имена модулей – со строчного. Что имя self, хотя и не являющееся зарезервированным, играет особую роль в классах. В главе 17 мы познакомимся с ещеодной крупной категорией имен, которые называются встроенными, то естьпредопределенными, но не зарезервированными (вследствие чего они допускают переопределение: инструкция open = 42 является вполне допустимой, но иногда вы можете пожалеть, что это так!).Имена не имеют типа, тип – это характеристика объектовПо большей части это лишь краткий обзор, но вы должны помнить, что крайне важно сохранить четкое понимание различий между именами и объектамив языке Python.