Есть ли какие-либо ключевые слова в 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(): выражение представляет собой задание
в противном случае утверждение представляет собой объявление