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
的单独实例。这个