擅长:python、mysql、java
<p>如果你正在编译一种类似于C语言的语言,请说:</p>
<pre><code>func()
{
var a = 1;
var *b = &a;
*b = 2;
assert(a == 2);
}
</code></pre>
<p>在Python中,所有的“Python中的所有内容都是引用”都是一个错误的名称。</p>
<p>Python中的所有内容都是一个引用,但许多核心类型(int、string)是不可变的,这一事实在许多情况下有效地撤销了这一点。在Python中没有直接实现上述内容的方法。</p>
<p>现在,您可以间接地这样做:对于任何不可变类型,将其包装为可变类型。埃弗米恩特的解决方案有效,但我经常这样做:</p>
<pre><code>a = [1]
b = a
b[0] = 2
assert a[0] == 2
</code></pre>
<p>(我这样做是为了解决Python在2.x中缺少“非本地”的问题几次。)</p>
<p>这意味着更多的开销:每一个不可变类型(或者每一个类型,如果你不试图区分的话)突然创建一个列表(或者另一个容器对象),所以你显著增加了变量的开销。单独来说,它不是很多,但是当应用到整个代码库时,它会累加起来。</p>
<p>您可以通过只包装不可变类型来减少这种情况,但是您需要跟踪输出中包装的变量和不包装的变量,以便您可以适当地使用“a”或“a[0]访问该值。可能会有毛。</p>
<p>至于这是不是个好主意,那要看你为什么这么做。如果你只是想运行一个VM,我倾向于说不。如果你想从Python调用你现有的语言,我建议你使用你现有的VM并为它创建Python绑定,这样你就可以从Python访问和调用它。</p>