深拷贝,浅拷贝,面试重要

  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:] 因为列表切片返回一个列表, 当下表越界时, 返回空列表, 不报错

猜你喜欢

转载自blog.csdn.net/JessePinkmen/article/details/83279179