0

コンテキスト:いくつかの数字のリストの正確な要素をランダムに消去し、いくつかのランダムなインデックスを抽出してaleaindexと呼ばれるセットに保存する必要がありました(完了、一部の SO ユーザーの助けのおかげで正常に動作します)。ここで、古いリストabなどを新しい、最終的にはより短いリストnewanewbなどに置き換えたいと思います。関数は次のとおりです。

def myfunction(N, other_parameters, a, b, c):
    ...
    while (...):
        aleaindex.add(random.randint(..., ...))
    ...
    new_a = [v for i, v in enumerate(a) if i not in aleaindex]
    while a: a.pop()
        a = new_a[:]
    ...

他のリストbcなどについても同様です。

問題: 関数はモジュール内でそれらを正しく変更しているように見えますが (印刷によってチェックされます)、変更されたリストをモジュールの外側、つまり「メイン」ファイルに印刷すると、リストは変更されていません。どこが間違っていますか?

4

3 に答える 3

2

あなたが何をしようとしているのかわかりませんが、スニペットからは明らかに失われています。あなたのコードはあまり意味がなく、複数の問題があります。それにもかかわらず、あなたが尋ねた問題 - リストが完全に変更されていないのはなぜですか? - このループに関連しているようです:

while a: a.pop()
    a = new_a[:]

関数を次のように呼び出すとします。

list1 = [1, 2, 3, 4, 5, 6, 7]
myfunction(N, other_parameters, list1, [], [])

何が起こるかというと、最初の行を呼び出すと、呼び出された変数が取得list1され、リストを指します。

list1 はリストを指します

関数 を呼び出すと、関数myfunction()は、とりわけ、aが指す同じリストを指す変数 を作成しlist1ます。

a は list1 と同じリストを指すようになりました

ここまでは順調ですね。次に、以下のループに入ります。

while a:
    a.pop()
    a = new_a[:]

その最初の行 ( a.pop()) で、リストからアイテムを取得します。変数alist1ポイントの両方が同じリストを指しているため、同じ結果が表示されます...

リストからアイテムを削除する

...ループの次の行 ( ) ではなかった場合a = new_a[:]。この行では、別の リストaを指すように変数を作成しています。

a は別のリストを指す

これで、実行するすべての操作がaこのリストに表示されますが、これは とはまったく関係ありませんlist1。たとえばa.pop()、次の反復で実行して取得できます。

他のリストから飛び出す

a = new_a[:]ただし、この行は指しているリストをさらに別の別のリストに置き換えるa ためまったく意味がありません。

また変える?!

それで、解決策は何ですか?知らない。私が言ったように、あなたのコードから意味をなすことは (少なくとも私には) 不可能です。自分がやろうとしていることについてもう少しよく考えて、もう少し文脈を加えて説明してください。

于 2013-06-01T15:11:08.007 に答える