每个循环后如何重置列表?

时间:2019-08-08 12:38:08

标签: python list loops

我想每次调用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]]

1 个答案:

答案 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()