<blockquote>
<p>names are references to objects</p>
</blockquote>
<p>是的。如果只想理解Python变量的语义,就不必关心对象在哪里;它们在内存中的某个地方,Python实现为您管理内存。他们如何做到这一点取决于实现(CPython、Jython、PyPy…)。在</p>
<blockquote>
<p>names in python are like C++ references</p>
</blockquote>
<p>不完全是。重新分配C++中的引用实际上重新分配引用的内存位置,例如在</p>之后。
<pre><code>int i = 0;
int &r = i;
r = 1;
</code></pre>
<p>这是真的<code>i == 1</code>。在Python中不能这样做,除非使用可变容器对象。最接近C++引用行为的是</p>
^{pr2}$
<blockquote>
<p>are very similar to automatically dereferenced pointers variables in C</p>
</blockquote>
<P>不,因为它们在上述方面类似于C++参考文献。在</p>
<blockquote>
<p>Does Python names contain some kind of address in them or is it just a name to a memory location?</p>
</blockquote>
<p>前者更接近于事实,假设一个简单的实现(同样,PyPy可能做的事情与CPython不同)。在任何情况下,Python变量不是存储位置,而是可能存在于内存中任何位置的对象的标签/名称。在</p>
<p>Python进程中的每个对象都有一个<em>标识</em>,可以使用<code>id</code>函数获得,该函数在CPython中返回其内存地址。您可以检查两个变量(或更一般的表达式)是否引用同一个对象,方法是检查它们的<code>id</code>,或者更直接地使用<code>is</code>:</p>
<pre><code>>>> i = [1, 2]
>>> j = i # a new reference
>>> i is j # same identity?
True
>>> j = [1, 2] # a new list
>>> i == j # same value?
True
>>> i is j # same identity?
False
</code></pre>