请教,这道题的答案是?

这道题的答案是?


arr = [[]]*3
arr[0].append(7)
try:
    print(arr[1][0])
except IndexError:
    print('0')
阅读 4.1k
8 个回答

这是因为arr[0],arr[1],arr[2]在内存中的地址是一样的,所以你往arr[0]中添加7,后两个也变成一样的了,所以结果就是7了

弄懂这两个区别就明白了

arr = [[],[],[]]
print id(arr[0]),id(arr[1]),id(arr[2])

arr = [[]]*3
print id(arr[0]),id(arr[1]),id(arr[2])
Uncaught SyntaxError: Unexpected token :

这是一道陷阱题:绝大多数人给的答案可能是:0, 因为很容易认为 arr = [[7],[],[]]

arr是[[7], [7], [7]],结果7

我来解释一下,在python中,list 实例乘以数字,是认为是重复 repeat 的意思,关于这点的源码操作呢,在listobject.clist_repeat 函数中,https://github.com/python/cpy... ,挑重点解释下:

static PyObject * list_repeat(PyListObject *a, Py_ssize_t n)
{
    ...
    np = (PyListObject *) PyList_New(size);
    items = np->ob_item;
    if (Py_SIZE(a) == 1) {
        elem = a->ob_item[0];
        for (i = 0; i < n; i++) {
            items[i] = elem;
            Py_INCREF(elem);
        }
        return (PyObject *) np;
    }
    ...
}

a->ob_item[0] 也就是指向一个空数组 [] 的指针, 将它的值都赋值给 items[0:n] = elem 。出来的结果就是 arr 中有3个元素,但是这3个元素都是都一个对象的引用。当对任何一个对象操作时, arr[0].append(7) ,因为引用的关系,此时数组就变成了:

[[7], [7], [7]]

因此打印的结果就是7了。

这种一般都系很闲的人才会去做

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题