这道题的答案是?
arr = [[]]*3
arr[0].append(7)
try:
print(arr[1][0])
except IndexError:
print('0')
这道题的答案是?
arr = [[]]*3
arr[0].append(7)
try:
print(arr[1][0])
except IndexError:
print('0')
弄懂这两个区别就明白了
arr = [[],[],[]]
print id(arr[0]),id(arr[1]),id(arr[2])
arr = [[]]*3
print id(arr[0]),id(arr[1]),id(arr[2])
我来解释一下,在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了。
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
这是因为arr[0],arr[1],arr[2]在内存中的地址是一样的,所以你往arr[0]中添加7,后两个也变成一样的了,所以结果就是7了