Есть ли какие-либо ключевые слова объявления в Python? - PullRequest
11 голосов
/ 21 февраля 2009

Существуют ли какие-либо ключевые слова объявления в python, например локальные, глобальные, частные, публичные и т. Д. Я знаю, что это бесплатный тип, но как узнать, что это утверждение:

x = 5;
  • Создает новую переменную.

или

  • Устанавливает существующий.

Ответы [ 5 ]

15 голосов
/ 21 февраля 2009

Мне действительно нравится понимание, которое дает Ван Гейл, но оно не дает ответа на вопрос: «Как вы узнаете, если это утверждение: создает новую переменную или устанавливает существующую переменную?»

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

Программно, вы можете попробовать обратиться к переменной и посмотреть, есть ли исключение «Ошибка имени»

try:
    x
except NameError:
    # x doesn't exist, do something
else:
    # x exists, do something else

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

оповещение о мыльнице !!!

Несмотря на то, что Python выглядит довольно глупо для того, кто привык вводить имя класса (или печатать) снова и снова и снова ... на самом деле он настолько строг, насколько вы этого хотите.

Если вам нужны строгие типы, вы бы сделали это явно:

assert(isinstance(variable, type))

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

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

В настоящее время я работаю в ActionScript и печатаю такие вещи, как:

var win:ThingPicker = PopUpManager.createPopUp(fEmotionsButton, 
       ThingPicker, false) as ThingPicker;

который в python будет выглядеть так:

win = createPopup(parent, ThingPicker)

И, глядя на код ActionScript, я вижу, что статическая проверка типов просто не дает никаких преимуществ. Время жизни переменной настолько мало, что мне пришлось бы быть совершенно пьяным, чтобы сделать с ней что-то не так ... и компилятор спас бы меня, указав на ошибку типа.

14 голосов
/ 21 февраля 2009

Важно понимать, что в Python нет переменных, только «имена».

В вашем примере у вас есть объект "5", и вы создаете имя "x", которое ссылается на объект "5".

Если позже вы сделаете:

x = "Some string"

это все еще совершенно верно. Имя «x» теперь указывает на объект «Некоторая строка».

Это не конфликт типов, потому что само имя не имеет типа, только объект.

Если вы попробуете x = 5 + «Некоторая строка», вы получите ошибку типа, поскольку вы не можете добавить два несовместимых типа.

Другими словами, это не тип бесплатно. Объекты Python строго типизированы.

Вот несколько очень хороших обсуждений о наборе Python:

Редактировать : чтобы связать это со своим вопросом, имя может ссылаться на существующий или новый объект.

# Create a new int object
>>> x = 500
# Another name to same object
>>> y = x
# Create another new int object    
>>> x = 600
# y still references original object
>>> print y
500
# This doesn't update x, it creates a new object and x becomes
# a reference to the new int object (which is int because that
# is the defined result of adding to int objects).
>>> x = x + y
>>> print x
1100
# Make original int object 500 go away
>>> del y

Редактировать 2 : наиболее полное обсуждение разницы между изменчивыми объектами (которые могут быть изменены) и неизменяемыми объектами (которые не могут быть изменены) в официальной документации Python Data Model .

12 голосов
/ 21 февраля 2009

Стоит отметить, что есть глобальное ключевое слово, поэтому, если вы хотите сослаться на глобальное x:

x = 4
def foo():
    x = 7 # x is local to your function

Вам нужно сделать это:

x = 4
def foo():
    global x # let python know you want to use the top-level x
    x = 7
7 голосов
/ 21 февраля 2009

Не похоже, что запрашивающий пытается присвоить тип, просто чтобы указать, что это объявление, а не присвоение.

Похоже, вы ищете что-то похожее на javascript:

var x = 5;

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

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

0 голосов
/ 21 января 2010

Я только что понял, что есть и более прямой ответ:

x = 5

def test():
    print 'x' in globals()

if __name__ == "__main__":
    test()

Так что, если 'variablename' в globals (): заявление является заданием иначе заявление является декларацией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...