Есть ли какие-либо ключевые слова в Python?

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

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

или

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

Ответ 1

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

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

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

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

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

оповещение о soapbox!!!

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

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

assert(isinstance(variable, type))

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

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

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

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

который в python будет выглядеть следующим образом:

win = createPopup(parent, ThingPicker)

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

Ответ 2

Важное значение для понимания 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.

Ответ 3

Стоит отметить, что есть глобальное ключевое слово, поэтому, если вы хотите обратиться к глобальному 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

Ответ 4

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

Похоже, вы ищете что-то вроде javascript:

var x = 5;

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

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

Ответ 5

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

x = 5

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

if __name__ == "__main__":
    test()

Итак, если "variablename" в globals():   выражение представляет собой задание в противном случае   утверждение представляет собой объявление