Python CodeWars Kata将零移到列表末尾

Python CodeWars Kata将零移到列表末尾,python,algorithm,katacoda,Python,Algorithm,Katacoda,嘿,伙计们,我几乎解决了这个kata问题,但我的代码一直未能通过这个测试。有什么想法吗 def move_zeros(array): n = len(array) count = 0 for i in range(n): if array[i] is not 0: if type(array[i]) != int or type(array[i]) != float: array[c

嘿,伙计们,我几乎解决了这个kata问题,但我的代码一直未能通过这个测试。有什么想法吗

def move_zeros(array):
    n = len(array)
    count = 0
    
    for i in range(n):
        if array[i] is not 0:    
            if type(array[i]) != int or type(array[i]) != float:
                array[count] = array[i]
                count += 1
            else:
                array[count] = array[i]
                count += 1
            
    while count < n:
        array[count] = 0
        count += 1
    return array
def移动零点(数组):
n=len(数组)
计数=0
对于范围(n)中的i:
如果数组[i]不是0:
如果类型(数组[i])!=int或type(数组[i])!=浮动:
数组[计数]=数组[i]
计数+=1
其他:
数组[计数]=数组[i]
计数+=1
当计数
这是失败的测试:

[9,0.0,9,1,2,1,1,0.0,3,1,9,9,0,0,0,0,0,0]
应等于
[9,9,1,2,1,3,1,9,9,0,0,0,0,0,0,0]


我假设它是一个浮点值,所以我尝试用第二个if语句解释它,但没有用。

在比较数字时不要使用
is not
。这不是预期用途。而是使用
=
比较运算符


不是
或用于比较实际对象,而不是文字。

比较数字时不要使用
不是
。这不是预期用途。而是使用
=
比较运算符


,而
不是
,或用于比较实际对象,而不是文字。

深入探讨为什么使用is无法实现此功能:

is
检查对象是否确实指向同一对象。所有数字在python中都是对象,但是
0
int
对象与
0.0
float
对象不同


在“引擎盖”下,这些对象通过定义一个合适的
\uuuuueq\uuuu
方法,允许
int
s和
float
s之间相等,该方法是调用
0==0.0

时最终使用的方法,深入探讨由于使用is而无法工作的原因:

is
检查对象是否确实指向同一对象。所有数字在python中都是对象,但是
0
int
对象与
0.0
float
对象不同


在“引擎盖”下,这些对象通过定义一个合适的
\uuuueq\uuueq
方法,允许
int
s和
float
s之间相等,这是调用
0==0.0
时最终使用的方法。不要使用
is
进行比较,使用
=
。重复给定的[0,0.0,False,None],答案是[False,None,0,0.0]还是[False,None,0,0]?不要使用
is
进行比较,使用
=
。给定[0,0.0,False,None,0,0.0]的副本是[False,None,0,0.0]还是[False,None,0,0,0]?是的,但即使两个
int
具有相同的值,它们也可以/将是不同的对象。在标准python解释器上尝试
a=123456789
b=123456789
a是b
。啊!另一个有趣的事实是,当你给一个变量赋值时,它实际上变成了它自己的独立对象,所以在这种情况下你实际上创建了两个不同的对象。因此,
a
是一个对象,其内存地址代表数字123456789,而
b
位于另一个。因此,
123456789是123456789
有效,而将它们分配给变量的示例则无效。显然,这仅适用于像您的示例这样的“足够大”的数字。我尝试了字节边界,但1个字节有效,而2个字节无效,我不知道在这两者之间的什么地方会下降。是的,对不起,我应该提到这一点。这里有一篇关于范围的好文章,请注意,这只是标准python解释器的一个实现细节,在例如pypy中可能有所不同,因此您不应该依赖
is
int
s实现平等。嘿,伙计们,谢谢你们的回复,但我使用
的原因不是因为另一个原因如果我使用
,测试失败=
[1,无,2,1,0,0]应等于[1,无,2,False,1,0,0]
是与原代码一起出现故障的代码。当我使用
is not
时,此测试通过。是的,但即使两个
int
s可以/将是不同的对象,即使它们具有相同的值。在标准python解释器上尝试
a=123456789
b=123456789
a是b
。啊!另一个有趣的事实是,当你给一个变量赋值时,它实际上变成了它自己的独立对象,所以在这种情况下你实际上创建了两个不同的对象。因此,
a
是一个对象,其内存地址代表数字123456789,而
b
位于另一个。因此,
123456789是123456789
有效,而将它们分配给变量的示例则无效。显然,这仅适用于像您的示例这样的“足够大”的数字。我尝试了字节边界,但1个字节有效,而2个字节无效,我不知道在这两者之间的什么地方会下降。是的,对不起,我应该提到这一点。这里有一篇关于范围的好文章,请注意,这只是标准python解释器的一个实现细节,在例如pypy中可能有所不同,因此您不应该依赖
is
int
s实现平等。嘿,伙计们,谢谢你们的回复,但我使用
的原因不是因为另一个原因如果我使用
,测试失败=
[1,无,2,1,0,0]应等于[1,无,2,False,1,0,0]
是与原代码一起出现故障的代码。当我使用
不是
时,此测试通过。嘿,谢谢你的回复,但我使用
不是
的原因是,如果我使用
,则另一个测试失败=
[1,无,2,1,0,0]应等于[1,无,2,False,1,0,0]
是与原代码一起出现故障的代码。当我使用
不是
时,这个测试通过了