1. 程式人生 > >深拷貝,淺拷貝,面試重要

深拷貝,淺拷貝,面試重要

  1. 思考下面的程式碼執行出的結果是什麼:
    list = [0, 1, 2]
    list[1] = list
    print(list)

    list的第2個元素指向list本身, 所以無限迴圈

  2. 如何得出list = [0, [0, 1, 2], 2]這樣的結果?

    list[1] = list[:]

  3. 經過以下步驟, a和b分別是多少? 為什麼?
    a = [0, [1, 2], 3]

    b = a[:]
    a[0] = 8
    a[1][1] = 9

a[:]是淺拷貝, 只對物件最頂層進行拷貝

  1. 如何保證第3題中最終b = [0, [1, 2], 3]

    使用深拷貝

  2. 寫出下面程式碼執行結果:
    L = [1, 2]
    M = L
    L = L + [3, 4]
    print(L)
    print(M)

  3. 寫出下面程式碼執行結果:
    L = [1, 2]
    M = L
    L += [3, 4]
    print(L)
    print(M)

    L += [3, 4] 是L本身加上[3, 4]

    L = L + [3, 4] 先計算等號右邊, 得到一個新的引用, 指向新的L(等號右邊的L是原來的L, 等號左邊的是一個新的L)

  4. 執行以下程式碼:

def foo(a, b, c=[]):
c.append(a)
c.append(b)
print©

foo(1, 2) python直譯器沒有接收到c的引數, 使用預設的空列表(預設引數)

foo(1, 2, []) python直譯器接收到新的c的引數, 就是用新的空列表, 此時, 預設引數的列表已經變為[1, 2]

foo(3, 4) python直譯器沒有接收到c的引數, 繼續使用預設的預設列表, 即[1, 2].append[3, 4]

a = [0,1,2,3]

a[10] 不存在這個元素, 報錯(下標越界)
a[10:] 因為列表切片返回一個列表, 當下表越界時, 返回空列表, 不報錯