為什么我的Tree物件不保留我傳遞的值?None每次我運行腳本時它總是繼續列印。
班級:
class Tree:
def __init__(self,key=None):
self.left,self.right = None,None
self.key = key
def insert(key):
return Tree(key)
def convert(self,list):
if len(list) > 1:
mid = len(list)//2
self = Tree.insert(list[mid])
self.left = Tree.convert(self,list[:mid])
self.right = Tree.convert(self,list[mid 1:])
else:
try:
self = Tree.insert(list[0])
except:
self = None
return self
輸入:
int_list = [1,2,3]
主要的:
tree = Tree()
tree.convert(int_list)
print(tree.key)
print(tree.left.key)
print(tree.right.key)
預期產出
2
1
3
收到的輸出
None
有沒有辦法解決這個問題,同時保持convert()作為類的方法Tree。
uj5u.com熱心網友回復:
問題是您的convert方法不對 的當前值做任何事情self,而是覆寫它。主程式呼叫 on 方法tree(self在函式中),但由于self被丟棄并為該本地名稱分配了另一個值,因此主程式tree保持不變。
很明顯,您convert直接在Tree. 這實際上是朝著正確的方向發展,但您也應該在主程式中這樣做,然后將該convert方法宣告為靜態方法——不帶self引數。主程式應使用此方法回傳的樹節點。
以下是修正最少的版本,并附有說明更改位置的注釋:
class Tree:
def __init__(self, key=None):
self.left,self.right = None,None
self.key = key
def insert(key):
return Tree(key)
# Define as static, without a self parameter
@staticmethod
def convert(list):
if len(list) > 1:
mid = len(list)//2
self = Tree.insert(list[mid])
# As convert is now static, don't pass self argument
self.left = Tree.convert(list[:mid])
self.right = Tree.convert(list[mid 1:])
else:
try:
self = Tree.insert(list[0])
except:
self = None
return self
int_list = [1,2,3]
# Don't call the Tree constructor,
# but get the root from calling `convert` as a static method
tree = Tree.convert(int_list)
print(tree.key) # 2
print(tree.left.key) # 1
print(tree.right.key) # 3
這可行,但仍有一些需要改進的地方:
self當它不是實體方法時,最好不要使用名稱(就像現在這里的情況一樣)。你可以命名它root。- 當您將串列為空(而不是具有 1 個元素)
try的情況用作基本情況時,您的代碼將更短(沒有 that )。 - 不要
list用作名稱 - 它已用于本機list型別。 - 該方法
insert是如此基本,以至于它并沒有真正帶來任何優勢。它實際上是比呼叫更短的Tree代碼Tree.insert。所以放棄那個insert方法。 - 構造
Tree函式不應該有默認值key。創建沒有價值的根節點是不好的做法。一棵空樹沒有節點,沒有節點。所以洗掉那=None部分。 None您可以同時分配left和right通過鏈接=。
所以我們得到這個:
class Tree:
def __init__(self, key): # No default for key.
self.left = self.right = None # chain assignment
self.key = key
# No need for insert method
# Define as static, without a self parameter
@staticmethod
def convert(values): # Don't use list as name
if values:
mid = len(values)//2
root = Tree(values[mid]) # Call constructor directly
root.left = Tree.convert(values[:mid]) # No self argument
root.right = Tree.convert(values[mid 1:])
return root
int_list = [1,2,3]
# Don't call the Tree constructor,
# but get the root from calling `convert` as a static method
tree = Tree.convert(int_list)
print(tree.key) # 2
print(tree.left.key) # 1
print(tree.right.key) # 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520632.html
上一篇:嵌套字典到嵌套串列(復選框)
