Python 更改函数语句中给定的变量
到目前为止,我的代码是:Python 更改函数语句中给定的变量,python,error-checking,Python,Error Checking,到目前为止,我的代码是: def errorCheckInt(n): try: n = int(n) checkValue1 = True except: checkValue1 = False 它应该接受一个变量输入(n),如果可能的话,将其更改为整数。如果是字符串,它将尝试获取不同的输入 但是,它没有起作用,我认为这是因为您无法更改代码中的变量 这可能不是很清楚,所以我举个例子: testingNum = "2" # def
def errorCheckInt(n):
try:
n = int(n)
checkValue1 = True
except:
checkValue1 = False
它应该接受一个变量输入(n),如果可能的话,将其更改为整数。如果是字符串,它将尝试获取不同的输入
但是,它没有起作用,我认为这是因为您无法更改代码中的变量
这可能不是很清楚,所以我举个例子:
testingNum = "2"
# def errorCheckInt here
errorCheckInt(testingNum)
# Should change testingNum to integer value 2, not string "2"
接下来是一个while语句,检查它是否成功(checkValue1是否为True或False),然后可能请求新的输入并进行错误检查(取决于用户提供的输入)
如果这仍然不是很清楚,只需评论一个问题,我也许可以告诉你我的想法
提前谢谢 运行
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
我不清楚你说“你不能改变代码中的变量”是什么意思。老实说,我将在这里迈出一大步(因为我不知道您对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
时,也是与初始[]
相同的对象。另一方面,当您将整数或字符串重新分配给变量时,您只需更改变量指向的对象。就这些
这如何适用于您的示例?
实际上,您所缺少的只是一条返回
语句:
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语句是不必要的,但有时显式是值得的