code: def _step(self, actions):
      
  
      # Pre-conditions: common_preconditions, see `assert_common_preconditions`.
      #               : len(actions) == len(self._envs)
      self.assert_common_preconditions()
      assert len(actions) == len(self._envs)
  
      observations = []
      rewards = []
      dones = []
      infos = []
  
      # Take steps in all environments.
      for env, action in zip(self._envs, actions):
        observation, reward, done, info = env.step(action)
  
        observations.append(observation)
        rewards.append(reward)
        dones.append(done)
        infos.append(info)
  
      # Convert each list (observations, rewards, ...) into np.array and return a
      # tuple.
      return tuple(map(np.stack, [observations, rewards, dones, infos]))
docs: Takes a step in all environments, shouldn't pre-process or record.
  
      Subclasses should override this to do the actual step if something other
      than the default implementation is desired.
  
      Args:
        actions: (np.ndarray) with first dimension equal to the batch size.
  
      Returns:
        a tuple of stacked raw observations, raw rewards, dones and infos.