Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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_List_Pyqt5 - Fatal编程技术网

Python列表在应该的时候不相等

Python列表在应该的时候不相等,python,list,pyqt5,Python,List,Pyqt5,有人能解释一下为什么这两个列表不相等吗?我的意思是输出应该是真的,但它的输出是假的。为什么? # CASE 1 list1 = [] for item in [self.home_btn, self.secret_dir_btn, self.info_btn]: list1.append(QPropertyAnimation(item, b"size")) # CASE 2 self.home_btn_anim = Q

有人能解释一下为什么这两个列表不相等吗?我的意思是输出应该是真的,但它的输出是假的。为什么?

    # CASE 1
    list1 = []
    for item in [self.home_btn, self.secret_dir_btn, self.info_btn]:
        list1.append(QPropertyAnimation(item, b"size"))

    # CASE 2
    self.home_btn_anim = QPropertyAnimation(self.home_btn, b"size")
    self.secret_dir_btn_anim = QPropertyAnimation(self.secret_dir_btn, b"size")
    self.info_btn_anim = QPropertyAnimation(self.info_btn, b"size")
    list2 = [self.home_btn_anim, self.secret_dir_btn_anim, self.info_btn_anim]

    # Output
    print(list1 == list2)
    # Further code

另外,如果我使用案例1来创建列表,我的后续代码将无法正常工作。但是使用案例2创建列表可以使代码正常工作。为什么?我该如何解决这个问题。

首先,让我们重温一下python的比较

相同类型的序列也支持比较。特别是,元组和列表是通过比较相应的元素按字典顺序进行比较的。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须具有相同的类型和长度

因此,每个元素必须等于另一个序列中对应的元素。如何检查对象的相等性?如果一个对象未实现,则该类型的两个对象之间的比较仅检查两个对象是否完全相同。与中一样,对同一对象的引用-这就是
操作符所做的

class Foo():
通过
a=Foo()
b=Foo()
打印(a是a)
#打印正确
打印(a是b)
#打印错误
由于未实现
\uuuu eq\uuuu
,因此只能执行
is
检查。这显然会导致不同对象引用的错误

如果愿意,您可以扩展
QPropertyAnimation
并实现自己的
\uuuuueq\uuuu
-

类MyQPropertyImation(QPropertyImation):
定义(自身、其他):
如果不存在(其他,QProperty动画):
#不要与其他类型进行比较
返回未执行
#检查两个对象的属性'target'和'propertyName'是否相等
返回self.target==other.target和self.propertyName==other.propertyName

但请注意,为动画对象实现相等可能并不理想。但是,如果您严格要求基于这些属性的等式用于您的用例,那么这可能很好。

首先,介绍一下python的比较方法

相同类型的序列也支持比较。特别是,元组和列表是通过比较相应的元素按字典顺序进行比较的。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须具有相同的类型和长度

因此,每个元素必须等于另一个序列中对应的元素。如何检查对象的相等性?如果一个对象未实现,则该类型的两个对象之间的比较仅检查两个对象是否完全相同。与中一样,对同一对象的引用-这就是
操作符所做的

class Foo():
通过
a=Foo()
b=Foo()
打印(a是a)
#打印正确
打印(a是b)
#打印错误
由于未实现
\uuuu eq\uuuu
,因此只能执行
is
检查。这显然会导致不同对象引用的错误

如果愿意,您可以扩展
QPropertyAnimation
并实现自己的
\uuuuueq\uuuu
-

类MyQPropertyImation(QPropertyImation):
定义(自身、其他):
如果不存在(其他,QProperty动画):
#不要与其他类型进行比较
返回未执行
#检查两个对象的属性'target'和'propertyName'是否相等
返回self.target==other.target和self.propertyName==other.propertyName

但请注意,为动画对象实现相等可能并不理想。但是,如果您严格希望基于这些属性的相等性用于您的用例,那么这可能很好。

正如他们已经向您指出的那样,序列之间的比较是逐元素进行的,考虑到您试图做的是比较QPropertyImation

另一方面,由于设计原因,QoObject不具有可比性,因为它们处理许多内部状态,这意味着即使它们具有相同的属性,它们的行为方式也不相同。QPropertyAnimation是QObject,因此它们也继承了该限制

考虑到这一点,不建议实施
\uuuu eq\uuu
方法,因为它与预定义的设计相矛盾,相反,如果要比较某些属性,请创建一个按属性比较属性的方法:

def compare_animations(animation1, animation2):
    return (
        animation1.target() is animation2.target()
        and animation1.propertyName() == animation2.propertyName()
    )

正如他们已经向您指出的,序列之间的比较是逐元素进行的,考虑到您试图做的是比较QPropertyAnimation

另一方面,由于设计原因,QoObject不具有可比性,因为它们处理许多内部状态,这意味着即使它们具有相同的属性,它们的行为方式也不相同。QPropertyAnimation是QObject,因此它们也继承了该限制

考虑到这一点,不建议实施
\uuuu eq\uuu
方法,因为它与预定义的设计相矛盾,相反,如果要比较某些属性,请创建一个按属性比较属性的方法:

def compare_animations(animation1, animation2):
    return (
        animation1.target() is animation2.target()
        and animation1.propertyName() == animation2.propertyName()
    )

编辑帖子以修复打字错误。请编辑帖子以修复打字错误,而不是发布评论。您可以创建并分配
qPropertyImation
的单独实例。该类可能没有为其实现的
\uuuu eq\uuu
,该类根据某些参数检查不同实例之间的相等性。因此,所有对象都是不同的。该类似乎没有实现
\uuuuu eq\uuuuuu
方法。好的,谢谢,但是有什么方法可以实现吗,我的意思是,如果我使用case one创建QPropertyAnimation对象,那么我的进一步代码不起作用,而是使用case 2,编辑帖子以修复打字错误正在正常工作。请编辑帖子以修复打字错误,而不是发布评论。您可以创建并分配
qPropertyImation
的单独实例。这个