Python 一些断言错误失败
我试图按从奇数到偶数的顺序对列表进行排序,但当我将其传递给assert语句时,它只对少数assert语句起作用。查看打印输出,所有内容都应该按照从奇数到偶数的正确顺序正常工作,但它没有通过assert语句Python 一些断言错误失败,python,Python,我试图按从奇数到偶数的顺序对列表进行排序,但当我将其传递给assert语句时,它只对少数assert语句起作用。查看打印输出,所有内容都应该按照从奇数到偶数的正确顺序正常工作,但它没有通过assert语句 def oddsBeforeEvens(theList): odd = [] even = [] for x in theList: if x % 2 == 0: even.append(x) else:
def oddsBeforeEvens(theList):
odd = []
even = []
for x in theList:
if x % 2 == 0:
even.append(x)
else:
odd.append(x)
theList = odd + even
aList = [-1, 0, 1, 2, 3, 4, 5, -6, -7]
oddsBeforeEvens(aList)
print(aList) # Debugging print
assert(aList[0] % 2 != 0) # odd integer
assert(aList[1] % 2 != 0)
assert(aList[2] % 2 != 0)
assert(aList[3] % 2 != 0)
assert(aList[4] % 2 != 0) # odd integer
assert(aList[5] % 2 == 0) # even integer
assert(aList[6] % 2 == 0)
assert(aList[7] % 2 == 0)
assert(aList[8] % 2 == 0) # even integer
阅读:
任何时候看到varname=,都是在函数的作用域内创建一个新的名称绑定。varname以前绑定到的任何值在此范围内都将丢失
因此,当您在前面的列表=奇数+偶数内部oddsbeforevens
时,它不再“指向”全局aList
,aList
保持不变。您可以通过以下方式进行修复:
def oddsBeforeEvens(theList):
...
return odd + even
...
aList = oddsBeforeEvens(aList)
...
在函数中,为列表指定一个值。无论何时为函数中的变量赋值,Python都会假定该变量是该函数的局部变量,除非您显式地声明为其他变量
所以,当你写作的时候
theList = odd + even
Python为该函数创建一个名为theList
的局部变量。原始的列表
变量未被触动。因此,当您断言aList[1]%2!=0
,由于该元素仍然为0,因此失败
最好从函数返回新列表,如
def oddsBeforeEvens(theList):
odd = []
even = []
for x in theList:
if x%2 == 0:
even.append(x)
else:
odd.append(x)
return odd + even
您的函数实际上并没有修改输入。它只生成一个局部变量。带有“#调试打印”注释的一行应该让这一点变得显而易见。。。