code: def visit_Assign(self, node):
      
  
      # Generate tangent name of the assignment
      self.target = node.targets[0]
      self.value = node.value
  
      # Get the tangent node
      tangent_node = self.visit(self.value)
  
      # If no forward-mode statement was created, then no extra work is needed.
      if tangent_node == self.value:
        self.target = None
        return node
  
      if self.value:
        new_node = template.replace(
            tangents.tangents[gast.Assign],
            replace_grad=template.Replace.TANGENT,
            namer=self.namer,
            temp=self.tmp_node,
            tangent=tangent_node,
            target=self.target,
            value=self.value)
        # Ensure that we use a unique tmp node per primal/tangent pair
        self.reset_tmp_node()
      else:
        # We're already in ANF form right now,
        # so we can assume LHS is a single Name "z"
        def template_(z, f):
          tmp = f
          d[z] = tmp[0]
          z = tmp[1]
  
        new_node = template.replace(
            template_,
            replace_grad=template.Replace.TANGENT,
            namer=self.namer,
            z=self.target,
            f=tangent_node[0])
  
      # Add it after the original statement
      self.target = None
  
      # Add in some cool comments
      for i in range(len(new_node)):
        new_node[i] = comments.add_comment(new_node[i], 'Primal and tangent of: '
                                           '%s' % quoting.unquote(node))
      return new_node
docs: Visit assignment statement.
  
      Notes
      -----
      This method sets the `self.target` attribute to the first assignment
      target for callees to use.