What's the difference of name scope and a variable scope in tensorflow?
<p>What's the differences between these functions?</p>

<blockquote>
  <p><code>tf.variable_op_scope(values, name, default_name, initializer=None)</code></p>
  
  <p>Returns a context manager for defining an op that creates variables.
  This context manager validates that the given values are from the same graph, ensures that that graph is the default graph, and pushes a name scope and a variable scope.</p>
</blockquote>

<hr>

<blockquote>
  <p><code>tf.op_scope(values, name, default_name=None)</code></p>
  
  <p>Returns a context manager for use when defining a Python op.
  This context manager validates that the given values are from the same graph, ensures that that graph is the default graph, and pushes a name scope.            </p>
</blockquote>

<hr>

<blockquote>
  <p><code>tf.name_scope(name)</code></p>
  
  <p>Wrapper for <code>Graph.name_scope()</code> using the default graph.
  See <code>Graph.name_scope()</code> for more details.</p>
</blockquote>

<hr>

<blockquote>
  <p><code>tf.variable_scope(name_or_scope, reuse=None, initializer=None)</code></p>
  
  <p>Returns a context for variable scope.
  Variable scope allows to create new variables and to share already created ones while providing checks to not create or share by accident. For details, see the Variable Scope How To, here we present only a few basic examples.  </p>
</blockquote>