为什么 python 在函数内部引入新变量时给我一个未绑定的局部错误?
Why is python giving me an unbound local error on introducing new variable inside function?
x = int(input("Enter the input in seconds "))
def checkSeconds(x):
if x >= 86400:
d = x/86400
x = x%86400
if x >= 3600:
h = x/3600
x = x%3600
if x >= 60:
m = x/60
x = x%60
s = x
print(d, ":", h, ":" , m, ":", s)
checkSeconds(x)
错误:“UnboundLocalError:赋值前引用了局部变量 'd'”
请耐心等待,因为我是初学者并且还在学习。它说“赋值前引用的局部变量 'd'”。请让我知道如何修复此错误。
问题是你每次都打印变量 d
,但它只有在 x >= 86400
时才会被定义,在其他情况下变量 d
不存在因此引发 UnboundLocalError
异常。
其余变量也会发生同样的情况。
一个简单的解决方案是预先为所有这些设置默认值。
def checkSeconds(x):
d, h, m, s = 0, 0, 0, 0
d
、h
和 x
需要值,即使它们对应的条件(if
语句)不正确。
我还想在示例中向您展示一些其他内容。
我做的第一件事是将除法运算得到的商转换为整数。否则在此代码中,小时、分钟和秒还将包含您实际想要的小数部分。
我在这里做的第二件事是取出 input
调用并将其替换为下面的几个硬编码值。这样我就不用一遍又一遍地输入数据,取而代之的是一些简单的测试用例,可以验证代码是否为我工作。许多新程序员喜欢使用键盘与 运行ning 代码交互。这并没有错,在学术界要求学生在 运行 时间输入值是很常见的,也许只是为了强调代码的行为是 动态 的观点。但在现实世界中,实际提示对程序进行交互式输入是非常不寻常的,主要是因为它不方便并且容易出现数据输入错误或不一致。这是一个观点,我只是想让你考虑一下。
一旦我这样做了,我就能够定义一些值来测试几个不同的场景。
0
:none个条件匹配
59
:none个条件匹配
121
: 只有分钟条件匹配
3662
:时分秒匹配。
882221
:所有单位匹配。
通过这些更改,我们现在可以 运行 代码并得到我们想要的数字
def checkSeconds(x):
if x >= 86400:
d = int(x/86400)
x = x%86400
else:
d = 0
if x >= 3600:
h = int(x/3600)
x = x%3600
else:
h = 0
if x >= 60:
m = int(x/60)
x = x%60
else:
m = 0
s = x
print(d, ":", h, ":" , m, ":", s)
for x in [ 0, 59, 121, 3662, 882221 ]:
checkSeconds(x)
而且由于我对测试用例进行了硬编码,因此很容易使我的结果可重现。
$ python3 ./t.py
0 : 0 : 0 : 0
0 : 0 : 0 : 59
0 : 0 : 2 : 1
0 : 1 : 1 : 2
10 : 5 : 3 : 41
x = int(input("Enter the input in seconds "))
def checkSeconds(x):
if x >= 86400:
d = x/86400
x = x%86400
if x >= 3600:
h = x/3600
x = x%3600
if x >= 60:
m = x/60
x = x%60
s = x
print(d, ":", h, ":" , m, ":", s)
checkSeconds(x)
错误:“UnboundLocalError:赋值前引用了局部变量 'd'”
请耐心等待,因为我是初学者并且还在学习。它说“赋值前引用的局部变量 'd'”。请让我知道如何修复此错误。
问题是你每次都打印变量 d
,但它只有在 x >= 86400
时才会被定义,在其他情况下变量 d
不存在因此引发 UnboundLocalError
异常。
其余变量也会发生同样的情况。
一个简单的解决方案是预先为所有这些设置默认值。
def checkSeconds(x):
d, h, m, s = 0, 0, 0, 0
d
、h
和 x
需要值,即使它们对应的条件(if
语句)不正确。
我还想在示例中向您展示一些其他内容。
我做的第一件事是将除法运算得到的商转换为整数。否则在此代码中,小时、分钟和秒还将包含您实际想要的小数部分。
我在这里做的第二件事是取出 input
调用并将其替换为下面的几个硬编码值。这样我就不用一遍又一遍地输入数据,取而代之的是一些简单的测试用例,可以验证代码是否为我工作。许多新程序员喜欢使用键盘与 运行ning 代码交互。这并没有错,在学术界要求学生在 运行 时间输入值是很常见的,也许只是为了强调代码的行为是 动态 的观点。但在现实世界中,实际提示对程序进行交互式输入是非常不寻常的,主要是因为它不方便并且容易出现数据输入错误或不一致。这是一个观点,我只是想让你考虑一下。
一旦我这样做了,我就能够定义一些值来测试几个不同的场景。
0
:none个条件匹配
59
:none个条件匹配
121
: 只有分钟条件匹配
3662
:时分秒匹配。
882221
:所有单位匹配。
通过这些更改,我们现在可以 运行 代码并得到我们想要的数字
def checkSeconds(x):
if x >= 86400:
d = int(x/86400)
x = x%86400
else:
d = 0
if x >= 3600:
h = int(x/3600)
x = x%3600
else:
h = 0
if x >= 60:
m = int(x/60)
x = x%60
else:
m = 0
s = x
print(d, ":", h, ":" , m, ":", s)
for x in [ 0, 59, 121, 3662, 882221 ]:
checkSeconds(x)
而且由于我对测试用例进行了硬编码,因此很容易使我的结果可重现。
$ python3 ./t.py
0 : 0 : 0 : 0
0 : 0 : 0 : 59
0 : 0 : 2 : 1
0 : 1 : 1 : 2
10 : 5 : 3 : 41