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语句是不必要的,但有时显式是值得的