5

質問のある初心者なので、優しくしてください:

list = [1, 2, 3, 4, 5]
list2 = list

def fxn(list,list2):
    for number in list:
        print(number)
        print(list)
        list2.remove(number)
        print("after remove list is  ", list, " and list 2 is  ", list2)
    return list, list2

list, list2 = fxn(list, list2)
print("after fxn list is  ", list)
print("after fxn list2 is  ", list2)

これにより、次のようになります。

1
[1, 2, 3, 4, 5]
after remove list is   [2, 3, 4, 5]  and list 2 is   [2, 3, 4, 5]
3
[2, 3, 4, 5]
after remove list is   [2, 4, 5]  and list 2 is   [2, 4, 5]
5
[2, 4, 5]
after remove list is   [2, 4]  and list 2 is   [2, 4]
after fxn list is   [2, 4]
after fxn list2 is   [2, 4]

をしているだけでリストが変わる理由がわかりlist2.remove()ませんlist.remove()。それを理解するためにどの検索用語を使用すればよいのかさえわかりません。

4

2 に答える 2

14

これが起こっている理由はここで見つけることができます:

mlist = [1,2,3,4,5]
mlist2 = mlist

2番目のステートメントは「ポイント」mlist2mlist(つまり、両方が同じリストオブジェクトを参照します)、一方に加えた変更はもう一方に反映されます。

代わりにコピーを作成するには、これを試してください(スライス操作を使用)。

mlist = [1,2,3,4,5]
mlist2 = mlist[:]

スライス表記に興味がある場合は、このSO質問のPythonリスト(スライスメソッド)を使用すると、より多くの背景情報が得られます。

最後listに、 Pythonはすでにこの識別子を独自のデータ構造に使用しているため、識別子として使用することはお勧めできません(これがm、変数名の前に「」を追加した理由です)

于 2012-08-16T19:11:35.483 に答える
6

これは、割り当てを行った後、とlistの両方が同じリストを参照しているためです。list2list2=list

これを試して、同じオブジェクトを参照しているか、異なるオブジェクトを参照しているかを確認してください。

id(list)
id(list2)

例:

>>> list = [1, 2, 3, 4, 5]
>>> list2 = list
>>> id(list)
140496700844944
>>> id(list2)
140496700844944
>>> list.remove(3)
>>> list
[1, 2, 4, 5]
>>> list2
[1, 2, 4, 5]

元のリストではなくリストのコピーを参照するlistような複製コピーを本当に作成する場合は、スライス演算子を使用します。list2

list2 = list[:]

例:

>>> list
[1, 2, 4, 5]
>>> list2
[1, 2, 4, 5]
>>> list = [1, 2, 3, 4, 5]
>>> list2 = list[:]
>>> id(list)
140496701034792
>>> id(list2)
140496701034864
>>> list.remove(3)
>>> list
[1, 2, 4, 5]
>>> list2
[1, 2, 3, 4, 5]

listまた、元々は型リストを参照しているため、変数名として使用しないでください。ただし、独自の変数listを定義することにより、型リストを参照する元の変数を非表示にします。例:listlist

>>> list
<type 'list'>
>>> type(list)
<type 'type'>
>>> list = [1, 2, 3, 4, 5]
>>> list
[1, 2, 3, 4, 5]
>>> type(list)
<type 'list'>
于 2012-08-16T19:11:49.943 に答える