如何交换来自函数的元素?

How can one swap elements which come from a function?

所以我定义了一个 class 叫做“粒子”:

class Particle:
    def __init__(self, posInit, momInit, spin):
        self.posInit = posInit
        self.momInit = momInit
        self.spin = spin
    def momfT(self, t):
        return self.momInit*(math.cos(t))-self.posInit*(math.sin(t))
    def posfT(self, t):
        return self.posInit*(math.cos(t))+self.momInit*(math.sin(t))

P = [Particle(posInit = i, momInit = j, spin = choice(["up", "down"])) for i,j in zip(Zinitial,Pinitial)]

我现在要做的是在满足特定条件时切换粒子的位置。 所以像下面这样:

if cond==True:
  P[1].posfT[t], P[2].posfT[t1] = P[2].posfT[t1], P[1].posfT[t]

但是上面的方法不起作用,因为我正在尝试为函数分配一个值。

所以我不确定该怎么做?

您似乎打算将粒子随时间的位置和动量存储在 posfTmomfT(编辑:我之前以为您只想要当前的位置)。如果是这样,它们不应该是方法,而是属性。随着 t 的发展,您还应该有单独的方法来修改这些值。我建议像这样修改你的class:

class Particle:
    
    def __init__(self, posInit, momInit, spin):
        self.posInit = posInit
        self.momInit = momInit
        self.spin = spin
        self.momfT = dict()
        self.posfT = dict()
        self.calc_at_time(0)
    
    def calc_at_time(self, t):
        self.momfT[t] = self.momInit*(math.cos(t))-self.posInit*(math.sin(t))
        self.posfT[t] = self.posInit*(math.cos(t))+self.momInit*(math.sin(t))

注意:我假设 posfT 和 momfT 初始化为 t=0。我完全不知道这是否正确,请根据需要进行检查和更正。我在这里专注于代码。

然后您可以通过调用 calc_at_time(t)

在时间 t 设置新位置
t = 1
t1 = 2
P[1].calc_at_time(t)
P[1].calc_at_time(t1)
P[2].calc_at_time(t)
P[2].calc_at_time(t1)

然后用P[x].posfT[t]访问P[x]在时间t的位置。

因此,您正在尝试执行的操作现在应该起作用了:

if cond == True:
  P[1].posfT[t], P[2].posfT[t1] = P[2].posfT[t1], P[1].posfT[t]

含义:P[1] 在 [t] 的 posfT 变成 P[2] 在 t1 的 posfT,并且互为倒数。