-3

以下にいくつかのコードを示します: # 質問 9: ディープ リバース # 入力としてリストを取り、 # 入力リストのディープ リバースである新しいリストを返すプロシージャ deep_reverse を定義します。
# これは、リスト内のすべての要素を逆にすることを意味し、それらの要素のいずれかがリスト自体である場合、 # 内側のリスト内のすべての要素を完全に逆にします。

# Note: The procedure must not change the input list.

# The procedure is_list below is from Homework 6. It returns True if 
# p is a list and False if it is not.

def is_list(p):
    return isinstance(p, list)

#For example,
def deep_reverse(n):
    n.reverse()
    for entry in n:
        if is_list(entry):
            entry.reverse() 
            deep_reverseA(entry)        
    return n

def deep_reverseA(n):
    for entry in n:
        if is_list(entry):
            entry.reverse() 
            deep_reverseA(entry)          
    return n

p = [1, [2, 3, [4, [5, 6]]]]
print deep_reverse(p)
#>>> [[[[6, 5], 4], 3, 2], 1]
print p
#>>> [1, [2, 3, [4, [5, 6]]]]

q =  [1, [2,3], 4, [5,6]]
print deep_reverse(q)
#>>> [ [6,5], 4, [3, 2], 1]
print q
#>>> [1, [2,3], 4, [5,6]]

私の問題は、コードを実行すると p と q の値が変わることです。それらを変更しないようにするにはどうすればよいですか。Python ではインデックスが接続されていることを知っているので、indexA = indexB で indexA を変更すると、indexB が変更されます。それが、この問題を修正する際に私が抱えている問題です。

4

1 に答える 1

0

今ここで、説明付きで答えをお伝えします。

Python では、変数は格納されたオブジェクトへの単なるポインターです。あなたがあなたの投稿で言ったように、あなたが宣言しfoo = barた場合、fooは に等しいだけでなくbarfoo です bar。これは、明示的に言わない限り変更されません (たとえば、 を設定しますbar = 2)。したがって、元のリストのコピーを作成する方法が必要です。

Python にはlist slicingと呼ばれるものがあり、聞いたことがあると思います。indexA基本的にからindexBでリストの一部を取得できますmy_list[indexA:indexB]

ただし、これらのスペースを空白のままにすることもできます。indexA指定されていない場合、デフォルトは0であり、indexBデフォルトは-1(リストの最後の要素) です。

Soは からまでmy_list[2:]のすべての要素を返します。同様に に戻ります。my_list[2]my_list[-1]my_list[:3]my_list[0]my_list[3]

したがって、 を呼び出すとの正確なコピーmy_list[:]返されますが、実際のリスト自体は返されません。これがあなたがする必要があることです。my_list

したがって、それをコードに適用します。

def deep_reverse(n):
    ncopy = n[:]  #this is the part you need
    #rest of function, replace `n` with `ncopy`
    return ncopy

また、これを に適用しないdeep_reverseAでください。その関数では、コピーされたリストの元のリストを変更しているためです。に入力したリストを変更していません。これを に適用した場合、リストは実際には変更されません (オリジナルではなくコピーの逆を返すことになります)。deep_reversedeep_reverseA

于 2012-12-31T00:36:24.153 に答える