更改函数语句中给定的变量

Changing the variable given in a function statement

到目前为止我的代码是:

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 =,您更改 binding,而不是 value,因此 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) 如何在 [=78 的范围内外使用和定义变量=].

当您像这样重新分配一个值时:

n = int(n)

你实际上并没有修改外部变量持有的值(testingNum)。这是因为 Python 中的变量只是对对象的引用。这意味着您的变量将始终指向同一个对象,除非它被明确地重新分配。当您处理 可变性 的概念时,这会让人感到困惑。例如,列表、字典和 类 是可变对象。如果你这样做:

t = []
n = t

然后做:

n.extend([1,2,3,4])

您会看到 nt 现在看起来像:

[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 语句的用法是等同的。当您在函数内分配对变量的引用时,一旦退出函数,该变量就会超出范围;换句话说,如果您之后再尝试调用它,就会出错。为了避免这种情况,您需要在 outer 范围内的变量中捕获函数的结果。这使您可以继续使用刚刚在函数内计算的数据。

备注

完成您所要求的更好方法是使用 isinstance。例如,

print isinstance(4, int)
# True

print isinstance('4', int)
# False

这将自动检查该值是否是 int 类型的实例。 更清晰

进一步说明

可变性的一个有趣事实是,当您在函数内部传递对可变对象的引用时,使用 [].append(4) 修改对象将意味着指向该对象的任何变量(即使是来自外部)获得相同的 update 如果你愿意的话。因此,在某些情况下,使用 return 语句不是必需的,但明确说明有时是值得的。