我想每次调用while循环时都创建一个新列表(self.Input / self.Output)。并将此新列表附加到其末尾的另一个列表(self.Input_full / self.Output_full)。
我试图在while循环开始时重置列表,只需将它们设置为空即可:self.Output = [[],[],[],[]] 或删除他们持有的信息:del self.Output [:] 但这不起作用,因为那之后我在完整列表中得到了空列表
import threading
class PepperCommandEvaluator(object):
def __init__(self):
self.Input = [[],[],[],[]]
self.Input_full = []
self.Output = [[],[],[],[]]
self.Output_full = []
self.count = 0
self.event = threading.Event()
def send_thread(self):
while self.count < 2:
self.count = self.count + 1
self.event.set()
sequence = [[1,1,1],[1,0,1],[1,3,3]]
for cmd in sequence:
rospy.loginfo("sending command")
rospy.Rate(0.5).sleep()
msg = Twist()
msg.linear.x = cmd[0]
msg.linear.y = cmd[1]
msg.angular.z = cmd[2]
t = rospy.get_rostime()
self.Input[0].append(cmd[0])
self.Input[1].append(cmd[1])
self.Input[2].append(cmd[2])
self.Input[3].append(t.secs + t.nsecs * 1e-9)
self.Input_full.append(self.Input)
self.event.clear()
def receive_thread(self,msg):
if self.event.isSet():
self.frame_id = msg.header.frame_id
self.x_odom = msg.pose.pose.position.x
self.y_odom = msg.pose.pose.position.y
self.z_odom = msg.pose.pose.position.z
self.ang_odom = msg.pose.pose.orientation.z
self.time = msg.header.stamp.secs
self.Output[0].append(self.x_odom)
self.Output[1].append(self.y_odom)
self.Output[2].append(self.ang_odom)
self.Output[3].append(self.time)
else:
self.Output_full.append(self.Output)
if __name__ == "__main__":
tros = PepperCommandEvaluator()
tros.send_thread()
我想要的输出是在每个循环中获得一个新的self.Input和self.Output_odom并将此列表分别附加到self.Input_full和self.Output_full_odom中。 最后,取决于运行循环的次数,这应该看起来像这样: self.Output_full = [[self.Output_1,self.Output_2,...,self.Output_n]]
答案 0 :(得分:0)
由于python中的列表是通过引用处理的,因此当您将对Input
的引用附加到Input_full
上,然后删除Input
时,也会删除Input_full
中的条目。为避免这种情况,您想要附加Input
的副本,然后清除真实内容。您还可以在附加Input
后将其引用更改为空白列表。
def send_thread(self):
while self.count < 2:
self.count = self.count + 1
self.event.set()
sequence = [[1,1,1],[1,0,1],[1,3,3]]
self.Input = [[],[],[]] # Reassigning to a new list at the top
for cmd in sequence:
rospy.loginfo("sending command")
rospy.Rate(0.5).sleep()
msg = Twist()
msg.linear.x = cmd[0]
msg.linear.y = cmd[1]
msg.angular.z = cmd[2]
t = rospy.get_rostime()
self.Input[0].append(cmd[0])
self.Input[1].append(cmd[1])
self.Input[2].append(cmd[2])
self.Input[3].append(t.secs + t.nsecs * 1e-9)
self.Input_full.append(self.Input)
self.event.clear()