Изменение переменной, указанной в операторе функции
Мой код до сих пор:
def errorCheckInt(n):
try:
n = int(n)
checkValue1 = True
except:
checkValue1 = False
Предполагается взять переменную input (которая равна n) и заменить ее на целое число, если это возможно. Он попытается получить другой ввод, если это строка.
Однако, это не сработало, и я думаю, что это потому, что вы не можете изменить переменную в коде.
Это может быть не очень понятно, поэтому я привожу пример:
testingNum = "2"
# def errorCheckInt here
errorCheckInt(testingNum)
# Should change testingNum to integer value 2, not string "2"
После этого следует оператор while, проверяющий, был ли он успешным (независимо от того, является ли checkValue1 True или False), затем, возможно, запрашивающий новый ввод и проверяющий это (в зависимости от того, что вводит пользователь).
Если это все еще не очень ясно, просто прокомментируйте вопрос, и я смогу рассказать вам, что я имел в виду.
Заранее спасибо!
2 ответа
Мне не ясно, что вы имеете в виду, когда говорите "вы не можете изменить переменную в коде". Честно говоря, я собираюсь сделать прыжок здесь (так как я понятия не имею, где вы находитесь с точки зрения понимания Python).
Я чувствую, что у вас могут быть проблемы с двумя понятиями. (1) идея изменчивости объекта и (2) как переменные используются и определяются внутри и вне контекста Python.
Когда вы переназначаете значение следующим образом:
n = int(n)
Вы на самом деле не изменили значение, хранящееся в переменной снаружи (testingNum
). Это потому, что переменные в Python - это просто ссылки на объекты. Это означает, что ваша переменная всегда будет указывать на один и тот же объект, если она не будет переназначена явно. Это сбивает с толку, когда вы имеете дело с концепцией изменчивости. Например, списки, словари и классы являются изменяемыми объектами. Если вы делаете что-то вроде:
t = []
n = t
а затем сделать:
n.extend([1,2,3,4])
вы увидите, что оба n
а также t
теперь выглядят так:
[1,2,3,4]
Это не совсем таинственное поведение, когда ты наконец понимаешь, что происходит. Целое число 4
и [1,2,3,4]
это разные объекты. Единственная разница в том, что [1,2,3,4]
был также тот же объект, что и начальный []
когда он был назначен t
, С другой стороны, когда вы переопределяете целое число или строку переменной, вы просто меняете объект, на который указывает переменная. Это все.
Как это относится к вашему примеру?
По сути, все, чего вам не хватало, было return
заявление:
def errorCheckInt(n):
try:
n = int(n)
checkValue1 = True
except:
checkValue1 = False
return n
testingNum = "2"
newNum = errorCheckInt(testingNum) # You can catch it here with newNum.
Понимание использования оператора return равносильно. Когда вы назначаете ссылку на переменную внутри функции, эта переменная выходит из области видимости, как только вы выходите из функции; другими словами, если вы попытаетесь вызвать его позже, вы получите ошибку. Чтобы обойти это, вам нужно перехватить результат вашей функции в переменной, которая находится во внешней области видимости. Это позволяет вам продолжать работать с данными, которые вы только что рассчитали внутри функции.
Заметка
Лучший способ сделать то, что вы просите, это использовать isinstance
, Например,
print isinstance(4, int)
# True
print isinstance('4', int)
# False
Это автоматически проверит, является ли значение экземпляром int
тип. Это и яснее, и чище.
Дальнейшее уточнение
Интересный факт изменчивости состоит в том, что когда вы передаете ссылки на изменяемые объекты внутри функций, модифицируйте объект, скажем, [].append(4)
будет означать, что любая переменная, указывающая на этот объект (даже извне), получает такое же обновление, если хотите. Так что в некоторых случаях использование оператора return не обязательно, но иногда стоит быть явным.
Когда errorCheckInt
работает, переменная n
привязан к тому же значению, что и testingNum
, Однако с n =
, вы меняете привязку, а не значение так n
затем указывает на другое значение, чем testingNum
, Вам нужно передать изменяемый тип и изменить привязку внутри него:
def errorCheckInt(n):
try:
n[0] = int(n[0])
checkValue1 = True
except:
checkValue1 = False
testingNum = [ "2" ]
errorCheckInt(testingNum)
# testingNum is now 2 and type(testingNum) is int