Python Lambda表达式在排序时重置对象中变量的值

Python Lambda表达式在排序时重置对象中变量的值,python,lambda,Python,Lambda,我试图通过对象上变量的值对python中的对象列表进行排序。我使用下面的lambda表达式来实现这一点 p = [] for i in range(10): p.append(Obj()) p.sort(key=lambda l: l.get_chi_2(), reverse=False) for i in range(10): print(p[i].get_chi_2()) 但是,当出于某种原因运行时,它会将此变量的值重置回其原始值0。我用一个调试器检查它,直到这一行

我试图通过对象上变量的值对python中的对象列表进行排序。我使用下面的lambda表达式来实现这一点

p = []

for i in range(10):
     p.append(Obj())

p.sort(key=lambda l: l.get_chi_2(), reverse=False)

for i in range(10):
    print(p[i].get_chi_2())
但是,当出于某种原因运行时,它会将此变量的值重置回其原始值0。我用一个调试器检查它,直到这一行运行之后它才有正确的值。相关的目标函数如下所示

class Obj:
    chi_2 = -1

    def __init__(self):
        self.chi_2 = randint(0, 10)

    def get_chi_2(self):
        return self.chi_2

    def set_chi_2(self, chi_2):
        self.chi_2 = chi_2
我不确定是什么原因导致了这种情况,因为从我对lambda表达式的理解来看,它应该只是按照get函数返回的内容进行排序。单独调用get函数可以正确返回所需的变量,并且不会重置它。我甚至尝试直接访问变量,得到了相同的结果。但我很确定是排序行导致了问题。

我想您需要:

p.sort(key=lambda l: l.chi_2, reverse=False)
输出:

[5, 10, 0, 10, 0, 9, 8, 3, 1, 2]
[0, 0, 1, 2, 3, 5, 8, 9, 10, 10]
在更新后玩弄它之后

print([i.get_chi_2() for i in p])

print([i.chi_2 for i in p])

p.sort(key=lambda l: l.get_chi_2(), reverse=False)

print([i.chi_2 for i in p])
我仍然得到了一致的结果,我想我们可以把这看作是打字错误

[2, 9, 0, 5, 6, 10, 9, 7, 3, 5]
[2, 9, 0, 5, 6, 10, 9, 7, 3, 5]
[0, 2, 3, 5, 5, 6, 7, 9, 9, 10]

请出示证件。目前,该问题缺乏完整的类定义以及
p
@mkrieger1 p的定义。p是如下定义的对象列表,类的相关部分用于复制。是的,请显示,这样我们就可以复制和粘贴代码并看到问题所在。@mkrieger1我添加了一个for循环来生成一个包含10个对象的列表,并添加了init来随机生成变量值。现在我得到“1 13 3 7 8 9 10”。没有值被重置为0。如原始问题中所述,我尝试了这两种方法,但这两种方法都会导致值重置为0,这是初始化中设置的默认值。但这不是真的,我会编辑以显示我的输出,当我稍后再次尝试时,你知道为什么该函数不会得到与直接使用变量相同的结果吗?返回它可能会引用它,这很奇怪吗?我看看我是否可以复制它:)我又试了一次,直接引用它似乎已经奏效了,但我仍然不明白为什么通过方法引用它会导致问题
[2, 9, 0, 5, 6, 10, 9, 7, 3, 5]
[2, 9, 0, 5, 6, 10, 9, 7, 3, 5]
[0, 2, 3, 5, 5, 6, 7, 9, 9, 10]