擅长:python、mysql、java
<p>这个问题来自于对Python中的变量的误解。如果你习惯了大多数传统语言,你就有了一个心理模型,可以按照以下顺序来描述发生的事情:</p>
<pre><code>a = 1
a = 2
</code></pre>
<p>您认为<code>a</code>是存储值<code>1</code>的内存位置,然后更新为存储值<code>2</code>。这不是Python中的工作方式。相反,<code>a</code>以对值为<code>1</code>的对象的引用开始,然后被重新分配为对值为<code>2</code>的对象的引用。即使<code>a</code>不再引用第一个对象,这两个对象也可能继续共存;事实上,程序中的任何其他引用都可以共享它们。</p>
<p>使用参数调用函数时,将创建引用传入对象的新引用。这与函数调用中使用的引用不同,因此无法更新该引用并使其引用新对象。在您的示例中:</p>
<pre><code>def __init__(self):
self.variable = 'Original'
self.Change(self.variable)
def Change(self, var):
var = 'Changed'
</code></pre>
<p><code>self.variable</code>是对字符串对象<code>'Original'</code>的引用。当您调用<code>Change</code>时,您将创建对对象的第二个引用<code>var</code>。在函数内部,您将引用<code>var</code>重新分配给不同的字符串对象<code>'Changed'</code>,但引用<code>self.variable</code>是独立的,不会更改。</p>
<p>唯一的办法就是传递一个可变对象。因为这两个引用引用同一个对象,所以对该对象的任何更改都将反映在这两个位置。</p>
<pre><code>def __init__(self):
self.variable = ['Original']
self.Change(self.variable)
def Change(self, var):
var[0] = 'Changed'
</code></pre>