Python 전문가,
Python을 사용하여 BST를 구현하려고 시도했으며 여기에 삽입 함수에 대한 코드가 있습니다.
초안 1 :
def insert(self, val):
newNode = self._Node(val)
if (self._root is None):
self._root = newNode
else:
self._insert(self._root,val)
def _insert(self, node, val):
if node is None:
node = self._Node(val)
elif val >= node._val:
self._insert(node._right, val)
else:
self._insert(node._left, val)
하지만 뿌리를 제외하고는 나무를 만들 수 없습니다. 나는 아래 코드를 수정하면 괜찮아지기 때문에 두 함수를 전달하는 매개 변수로 어딘가에 엉망이 된 것 같습니다.
초안 2 :
def insert(self, val):
newNode = self._Node(val)
if (self._root is None):
self._root = newNode
else:
self._insert(self._root,val)
def _insert(self, node, val):
if val >= node._val:
if node._right is None:
node._right = self._Node(val)
else:
self._insert(node._right, val)
else:
if node._left is None:
node._left = self._Node(val)
else:
self._insert(node._left, val)
초안 2가 작동하는 이유를 이해하려고 노력하고 있지만 초안 1은 작동하지 않습니다. 여기에 도움이 필요하십니까? 미리 감사드립니다!
근본적인 오해는 변수 할당이 어떻게 작동하고 Python의 평가 전략과 상호 작용하는지 입니다.
기본적으로 첫 번째 초안에서 다음을 수행 할 때 :
def _insert(self, node, val):
if node is None:
node = self._Node(val)
...
단순히 이름 (변수) node
에 값을 할당하고 self._Node(val)
있지만 범위를 벗어나면 새 개체가 파괴됩니다! node
메서드 호출에 의해 전달 된 값을 참조하는 데 사용 되었지만 단순 할당은 이름으로 참조되는 객체를 변경하지 않고 이름을 다시 할당합니다.
그러나 두 번째 초안에서 :
def _insert(self, node, val):
if val >= node._val:
if node._right is None:
node._right = self._Node(val)
else:
self._insert(node._right, val)
당신은 개체 변이되는 , 즉`node._right = self._Node (발)
다음은 빛을 발하는 간단한 예입니다.
>>> def only_assign(object):
... x = 3
... object = x
...
>>> def mutate(object):
... object.attribute = 3
...
>>> class A:
... pass
...
>>> a = A()
>>> a
<__main__.A object at 0x7f54c3e256a0>
>>> only_assign(a)
>>> a
<__main__.A object at 0x7f54c3e256a0>
>>> mutate(a)
>>> a.attribute
3
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다