12

だから私はPythonを独学していますが、リストに問題があります。元のリストを保持しながら、関数にリストを渡し、項目をポップしたいと考えています。元のリストへのポインタを渡すのではなく、python「インスタンス」を渡されたリストにするにはどうすればよいですか?

例:

def burninate(b):
    c = []
    for i in range(3):
        c.append(b.pop())
    return c

a = range(6)
d = burninate(a)
print a, d

出力: [0, 1, 2] [5, 4, 3]
目的の出力: [0, 1, 2, 3, 4, 5] [5, 4, 3]

ありがとう!

4

7 に答える 7

14

他の回答が示唆しているように、リストのコピーを関数に提供できます。

別の方法として、関数は引数のコピーをとることができます。

def burninate(b):
    c = []
    b = list(b)
    for i in range(3):
        c.append(b.pop())
    return c

基本的に、関数が引数を変更するかどうかを頭の中で(そしてドキュメントの中で)明確にする必要があります。私の意見では、計算値を返す関数は引数を変更すべきではなく、引数を変更する関数は何も返さないはずです。例については、Pythonの[] .sort()、[]。extend()、{}。update()などを参照してください。明らかに例外があります(.pop()など)。

また、特定のケースによっては、関数を書き直して、引数を変更するpop()やその他の関数を使用しないようにすることもできます。例えば

def burninante(b):
    return b[:-4:-1]   # return the last three elements in reverse order
于 2008-10-22T23:00:37.723 に答える
10

burninate()次のように、リストのコピーを使用して呼び出すことができます。

d = burninate(a[:])

また、

d = burninate(list(a))

もう 1 つの方法は、メソッドでリストのコピーを作成することです。

def burninate(b):
    c=[]
    b=b[:]
    for i in range(3):
        c.append(b.pop())
    return c

>>> a = range(6)
>>> b = burninate(a)
>>> print a, b
>>> [0, 1, 2, 3, 4, 5] [5, 4, 3]
于 2008-10-22T22:42:32.643 に答える
6

同じことを行うもう少し読みやすい方法は次のとおりです。

d = burninate(list(a))

ここで、list()コンストラクターは に基づいて新しいリストを作成しaます。

于 2008-10-22T22:45:13.807 に答える
5

より一般的な解決策は、パラメータimport copyでを使用することです。copy.copy()

于 2008-10-22T23:00:00.890 に答える
2

その他のバージョン:

def burninate(b):
    c = []
    for i in range(1, 4):
        c.append(b[-i])
    return c
def burninate(b):
    c = b[-4:-1]
    c.reverse()
    return c

そしていつかあなたはリスト内包を気に入るはずです:

def burninate(b):
    return [b[-i] for i in range(1,4)]
于 2008-10-22T22:58:06.107 に答える
1

copy.deepcopy() を使用できます

于 2009-02-07T10:52:00.650 に答える
0
burninate = lambda x: x[:-4:-1]
于 2008-10-22T23:09:10.093 に答える