Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一些断言错误失败_Python - Fatal编程技术网

Python 一些断言错误失败

Python 一些断言错误失败,python,Python,我试图按从奇数到偶数的顺序对列表进行排序,但当我将其传递给assert语句时,它只对少数assert语句起作用。查看打印输出,所有内容都应该按照从奇数到偶数的正确顺序正常工作,但它没有通过assert语句 def oddsBeforeEvens(theList): odd = [] even = [] for x in theList: if x % 2 == 0: even.append(x) else:

我试图按从奇数到偶数的顺序对列表进行排序,但当我将其传递给assert语句时,它只对少数assert语句起作用。查看打印输出,所有内容都应该按照从奇数到偶数的正确顺序正常工作,但它没有通过assert语句

 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

您的函数实际上并没有修改输入。它只生成一个局部变量。带有“#调试打印”注释的一行应该让这一点变得显而易见。。。