<p>您的示例将在某些编程语言中工作。(例如
<code>C</code>允许通过指针引用实现这一点。)它在这里不起作用的原因是Python中如何定义方法调用的语义。你知道吗</p>
<h3>Python中的名称绑定</h3>
<p>当你写作的时候</p>
<pre><code>self.data = None
</code></pre>
<p>这将为对象<code>None</code>分配一个新名称(<code>self.data</code>)。你知道吗</p>
<p>其中<code>self.Recur</code>定义为</p>
<pre><code>def Recur(self, node, data):
if node is None:
node = data
</code></pre>
<p>下面在<code>Recur</code>方法的上下文中为<code>None</code>提供了一个新名称:
<code>node</code>。你知道吗</p>
<pre><code>self.Recur(self.data, data)
</code></pre>
<p>但是,同一对象的内部作用域中的这个新名称(<code>node</code>)与外部作用域中的另一个名称(<code>self.data</code>)没有关联。你知道吗</p>
<p>当你写作的时候</p>
<pre><code>node = data
</code></pre>
<p>这会将名称<code>node</code>分配给一个新值,即
名称<code>data</code>引用。同样,这不影响名称
<code>self.data</code>。有关更多信息,请查看此<a href="http://www.jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/" rel="nofollow">blog post</a>。你知道吗</p>
<h3>如何做你想做的</h3>
<p>另一方面,如果希望<code>Recur</code>能够将值赋给<code>test</code>对象的任何属性,则可以这样做。在这里
是实现它的一种方法:</p>
<pre><code>class test:
def __init__(self):
self.data = None
def Recur(self, nodeName, data):
if self[nodeName] is None:
self[nodeName] = data;
def Insert(self, data):
self.Recur("data", data)
__getitem__ = self.__getattr__
__setitem__ = self.__setattr__
</code></pre>
<p><strong>NB:此代码未经测试</p>
<p>这允许<code>Insert</code>选择<code>"data"</code>为其赋值的名称(<code>"data"</code>)。<code>Recur</code>则使用Python的dict key get item语法为准dict对象中的键<code>data</code>赋值;但是,我们将get item和set item语义设置为与get属性相同,并将属性语义设置为与最后两行相同-这确保了<code>self["name"]</code>与<code>self.name</code>的意思相同。一个不那么神秘的实现是:</p>
<pre><code>def __getitem__(self, key):
return self.__getattr__(key)
</code></pre>