这道题的答案是?
arr = [[]]*3
arr[0].append(7)
try:
print(arr[1][0])
except IndexError:
print('0')
我来解释一下,在python中,list
实例乘以数字,是认为是重复 repeat
的意思,关于这点的源码操作呢,在listobject.c
的 list_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了。