素材牛VIP会员
请教,这道题的答案是?
 你***擦  分类:Python  人气:900  回帖:8  发布于6年前 收藏

这道题的答案是?


arr = [[]]*3
arr[0].append(7)
try:
    print(arr[1][0])
except IndexError:
    print('0')
 标签:python

讨论这个帖子(8)垃圾回帖将一律封号处理……

Lv6 码匠
素***2 学生 6年前#1

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

Lv4 码徒
逆***团 Linux系统工程师 6年前#2
Uncaught SyntaxError: Unexpected token :
Lv3 码奴
sc***31 Linux系统工程师 6年前#3

我来解释一下,在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了。

Lv5 码农
de***st CEO 6年前#4

这是 Michael_翔_ 的图,一眼就懂

Lv1 新人
编***魔 职业无 6年前#5

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

Lv2 入门
ok***23 产品经理 6年前#6

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

Lv5 码农
夏***t 移动开发工程师 6年前#7

弄懂这两个区别就明白了

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

arr = [[]]*3
print id(arr[0]),id(arr[1]),id(arr[2])
Lv5 码农
超***侠 Web前端工程师 6年前#8

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取