0

到目前为止,我的代码是:

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),然后可能会要求新的输入并检查错误(取决于用户提供的输入)。

如果这仍然不是很清楚,请评论一个问题,我也许可以告诉您我的想法。

提前致谢!

4

2 回答 2

1

当您说“您无法更改代码中的变量”时,我不清楚您的意思。老实说,我将在这里迈出一大步(因为我不知道你对 Python 的理解程度)。

有两个概念我觉得你可能会遇到麻烦。(1)是对象可变性的概念,以及(2)如何在 Python 内部和外部范围内使用和定义变量。

当您重新分配这样的值时:

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语句的使用无异于。当您在函数内分配对变量的引用时,该变量会在您退出函数后立即超出范围;换句话说,如果你尝试在之后调用它,你会得到一个错误。为了避免这种情况,您需要在外部范围内的变量中捕获函数的结果。这使您可以继续使用刚刚在函数内计算的数据。

笔记

做你要求的更好的方法是使用isinstance. 例如,

print isinstance(4, int)
# True

print isinstance('4', int)
# False

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

进一步澄清

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

于 2015-02-12T02:03:18.277 回答
1

运行时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
于 2015-02-12T01:47:42.393 回答