2016-05-13 4 views
-1

以下のコードを実行した結果はどうなりますか?

def insert(lst, em): 
    # insert em in sequence lst 
    i = 0 
    while em > lst[i]: 
     i = i+1 
     if i == len(lst): 
     break 

    lst[:] = lst[:i] + [em] + lst[i:] 

def choose(lst1, lst2): 
    # pick list 
    if lst1[0] < lst2[0]: 
    return lst1 
    else: 
    return lst2 

    l1 = [4] 
    l2 = [6] 
    insert(l2,5) 
    insert(l1,5) 
    l3 = choose(l1,l2) 
    print l1,l3############ 
    insert(l3,1) 
    print l1,l2,l3 

    >>> ================================ RESTART ================================ 
    >>> 
    [1, 4, 5] [5, 6] [1, 4, 5] 

は、私は、インサート(l3,1)が呼び出される前に、私が得ることを知っているL1 = L3 = [5] をそのL2 = [5,6]と同意その挿入した後(L3,1 )はL3 = [1 4 5]と呼ばれますが、なぜL1も変わるのです。誰も私のためにこれを明確にすることができますか?ここでPythonの割り当てとその動作

+2

L1とL3は同じリストです。 – kindall

答えて

1

は、ステップ・バイ・ステップに何が起こっているかである。

l1=[4] 
l2=[6] 
insert(l2,5)   # l2 = [5,6] 
insert(l1,5)   # l1 = [4,5] 
l3=choose(l1,l2)  # l3 = l1 
print l1,l3 
insert(l3,1)   # l3 = [1,4,5] and l1 = [1,4,5] 
print l1,l2,l3 

あなたがl3 = choose(l1,l2)を言うとき、それからl3l1とまったく同じリストに割り当てられていることを理解することが重要である - つまり、彼らは、まったく同じメモリ位置を指します。したがって、insert(l3,1)に電話すると、l1に効果的に挿入されます。

このブログの記事は、起こっているのより多くのものを説明するのに役立つかもしれません:あなたはchoose()list(lst1)(またはlist(lst2)を使用してlst1またはlst2のコピーを返した場合http://henry.precheur.org/python/copy_list

物事は異なるだろう例えば、文のこれらのシーケンスを考えます。 :

x = [4,5,6] 
id(x)   -- returns 4369059920 
y = x 
id(y)   -- returns 4369059920 (same as id(x)) 
y = list(x) -- make a copy of x 
id(y)   -- returns 4368985048 -- something different from id(x) 
関連する問題