2016-04-25 13 views
0

私はバイナリツリーのコードの次のスニペットを試し、arrと文字列を後で印刷しようとすると、正しい結果が得られますが、文字列は空です。何かご意見は?参照によって渡されるリストや値渡される文字列とは何か関係がありますか?Pythonの文字列対リストの奇妙な動作

def post_order(root, arr = []): 
    if(root is not None): 
     post_order(root.left, arr) 
     post_order(root.right, arr) 
     arr.append(root.value) 

def post_order1(root, string = ''): 
    if(root is not None): 
     post_order1(root.left, string) 
     post_order1(root.right, string) 
     string += str(root.value) 

# assume I've made my binary tree 
arr, string = [], '' 
post_order(root, arr) 
post_order1(root, string) 
print arr, string 
# arr holds the correct post-order sequence 
# string is empty 
+0

文字列は、文字列+ = 'ので不変ですstr(root.value) 'は多分やっていないかもしれません、新しい文字列を渡してそれを返すpost_order1を呼び出す前に+ =を意味しますか?私はあなたが文字列を属性にするクラスでうまくいくかもしれないと思う。 –

+1

関連:[Pythonでは、呼び出し元によって認識されるように関数がいくつかの引数を変更できるのはなぜですか?](http://stackoverflow.com/q/575196/4279) – jfs

+0

あなたは十分な情報を含んでいません。入力、希望および既存の出力を含めます。また、これらの関数を実際に返すことで、変数がガベージコレクトされるようにする必要があります。 – Pouria

答えて

1

Arrは、あなたが拡張する配列です。 post_order1に渡される文字列は不変オブジェクトであり、更新時にコピーが作成されます。その結果、元の文字列は変更されません。

+0

ありがとうございましたkofemann、たくさんの意味があります! –

2

Pythonでは、リストは変更可能であり、文字列は不変です。つまり、リストは変更できますが、文字列は変更できません。文字列は再割り当てのみできます。あなたの関数で

は、あなたが.append()を使用してリストを変更しているが、あなたは唯一の+=

+1

ああ、それは多くの意味があります!ありがとうブライアン:) –

-1

あなたの文字列を再割り当てしているあなたは、このようにコードを修正する必要があります

def post_order1(root, string = ''): 
    if not root : return string 

left = post_order1(root.left, string) 
right = post_order1(root.right, left) 
return right + str(root.value) 
+0

私はポストのコードを修正しました。ありがとう@ダニー劉 –