2016-06-22 4 views
0

リストのコピーをPythonの関数に渡そうとしているので、古いリストの情報を失うことなく新しいリストをポップして追加することができます。しかし、私は問題を抱えています。リストのコピーをPythonの関数に渡す

は、ここに私のコード第二の機能は、新しい、古いリストから要素を移動し、古いリストを空にすることなく、それぞれのための簡単な声明を印刷するようになっている

def show_magicians(magicians): 
    for magician in magicians: 
     print (magician.title()) 
     return magicians 

def make_great(magicians): 
    for magician in magicians: 
     new_magician = magicians.pop() 
     new_magicians.append(new_magician) 
     print (new_magician.title() + ", is a great magician!!") 
     return magicians 

new_magicians = [] 
magicians = ['merlin', 'blaine', 'agaybi', 'copperfield'] 
show_magicians(magicians) 
make_great(magicians[:]) 
print ('\n' , magicians) 
print ('\n' , new_magicians) 

です。問題は、唯一の要素が印刷され、同じ要素が唯一の要素であるということです。

私は間違っていますか?

+1

'make_great'によって作成された新しいリストを割り当てないで、' new_magicians = make_great(magicians [:]) 'を試してください。 – jonrsharpe

+1

@RobertRいいえ、それは問題ではありません - OP *は明示的にスライス表記 '[:]'を使って浅いコピーを渡します。問題はそれが 'new_magicians'とは無関係なことです! – jonrsharpe

+0

編集していただきありがとうございますJon Sharpe。これは私の最初の質問です。 –

答えて

2

def make_great(magicians): 
    for magician in magicians: 
     new_magician = magicians.pop() 
     new_magicians.append(new_magician) 
     print (new_magician.title() + ", is a great magician!!") 
    return magicians 
+0

私はそれをハッシュタグ付けして同じ結果が起こるので、return文は何もしないようです。今私は古いリストをそのまま残しますが、最後の2つの要素だけが新しいリストに移動しました!! –

+0

古いリストは、あなたの関数にそのコピーを送るので無傷であり、もう1つの問題はおそらくリストを反復している間にリストを変更するためです。あなたのコードは非常に混乱しています。なぜ一方のリストがパラメータとして渡され、もう一方のリストは渡されませんか? – polku

+0

列挙されているリストからアイテムがポップしているため、これは機能しません。 – tdelaney

1

私はに貢献したと思われ、existing answerはあなたの当面の問題を解決するが、あなたのコードはまだ不必要に混乱していますが、次のように最初の魔術師が

変更にmake_great機能を処理された後、あなたが戻ってきていますあなたはつづれている。

「正しい」magiciansmake_greatの範囲で変異を起こさないようにする方法です。このような変更可能な引数をとるPython関数は、のいずれかの引数を変更してNoneまたはのいずれかのオブジェクトを作成して返します。少なくともそのような些細な作業のために、その引数のの両方を、囲みスコープのオブジェクトで2番目のオブジェクトを返すように変更してはいけません。

たとえば、あなたが行っている可能性:

def make_great(magicians): 
    """Make each magician in the input great.""" 
    new_magicians = [] # create a brand new list 
    for name in magicians: # iterate over old list 
     new_magicians.append(name + ' is a great magician!') # add to new list 
    return new_magicians # note this is outside the for loop 

を次にあなたが関数の外new_magiciansを作成する必要がある、またはそれに元magiciansのコピーを渡さない:

magicians = ['merlin', 'blaine', 'agaybi', 'copperfield'] 
new_magicians = make_great(magicians) 
print(magicians) # still the same 
print(new_magicians) # brand new list 
0

さて、まず、あなたには本当にありがとうございました。私はついにこの問題とそれを解決する方法を考え出しました。私が取り組んでいる演習では、[:]を使ってリストの浅いコピーを作成し、それをポップして新しいリストを作成する関数に渡すことを望んでいます。

問題は、グローバルになるように外部に配置するのではなく、関数内に文を印刷するループを保持していたことです。ここで

は新しく、正しいコードです:

def show_magicians(magicians): 
    for magician in magicians: 
     print (magician.title()) 


def make_great(magicians): 
    while magicians: 
     new_magician = magicians.pop() 
     new_magicians.append(new_magician) 


new_magicians = [] 
magicians = ['merlin', 'blaine', 'agaybi', 'copperfield'] 
show_magicians(magicians) 
make_great(magicians[:]) 

for magician in magicians: 
    print ('\n' + magician.title() + " is a great magician!!") 

print ('\n') 
print (magicians) 
print ('\n') 
print (new_magicians) 

おかげで再び混乱して申し訳ありません。

関連する問題