code: def full_join(G, H, rename=(None, None)):
      """Returns the full join of graphs G and H.
  
      Full join is the union of G and H in which all edges between
      G and H are added.
      The node sets of G and H must be disjoint,
      otherwise an exception is raised.
  
      Parameters
      ----------
      G, H : graph
         A NetworkX graph
  
      rename : tuple , default=(None, None)
         Node names of G and H can be changed by specifying the tuple
         rename=('G-','H-') (for example).  Node "u" in G is then renamed
         "G-u" and "v" in H is renamed "H-v".
  
      Returns
      -------
      U : The full join graph with the same type as G.
  
      Notes
      -----
      It is recommended that G and H be either both directed or both undirected.
  
      If G is directed, then edges from G to H are added as well as from H to G.
  
      Note that full_join() does not produce parallel edges for MultiGraphs.
  
      The full join operation of graphs G and H is the same as getting
      their complement, performing a disjoint union, and finally getting
      the complement of the resulting graph.
  
      Graph, edge, and node attributes are propagated from G and H
      to the union graph.  If a graph attribute is present in both
      G and H the value from H is used.
  
      Examples
      --------
      >>> G = nx.Graph([(0, 1), (0, 2)])
      >>> H = nx.Graph([(3, 4)])
      >>> R = nx.full_join(G, H, rename=("G", "H"))
      >>> R.nodes
      NodeView(('G0', 'G1', 'G2', 'H3', 'H4'))
      >>> R.edges
      EdgeView([('G0', 'G1'), ('G0', 'G2'), ('G0', 'H3'), ('G0', 'H4'), ('G1', 'H3'), ('G1', 'H4'), ('G2', 'H3'), ('G2', 'H4'), ('H3', 'H4')])
  
      See Also
      --------
      union
      disjoint_union
      """
      R = union(G, H, rename)
  
      def add_prefix(graph, prefix):
          if prefix is None:
              return graph
  
          def label(x):
              return f"{prefix}{x}"
  
          return nx.relabel_nodes(graph, label)
  
      G = add_prefix(G, rename[0])
      H = add_prefix(H, rename[1])
  
      for i in G:
          for j in H:
              R.add_edge(i, j)
      if R.is_directed():
          for i in H:
              for j in G:
                  R.add_edge(i, j)
  
      return R
  
file_path: networkx/networkx/algorithms/operators/binary.py
imports: import networkx
label_desc: Use image node_id 7 for calling a global function with example usage: full_join(G, H, rename) and returns: R, nx, graph, prefix, x