如何交换来自函数的元素?
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]
但是上面的方法不起作用,因为我正在尝试为函数分配一个值。
所以我不确定该怎么做?
您似乎打算将粒子随时间的位置和动量存储在 posfT
和 momfT
中 (编辑:我之前以为您只想要当前的位置)。如果是这样,它们不应该是方法,而是属性。随着 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,并且互为倒数。
所以我定义了一个 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]
但是上面的方法不起作用,因为我正在尝试为函数分配一个值。
所以我不确定该怎么做?
您似乎打算将粒子随时间的位置和动量存储在 posfT
和 momfT
中 (编辑:我之前以为您只想要当前的位置)。如果是这样,它们不应该是方法,而是属性。随着 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 = 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,并且互为倒数。