>>> a = [[0]*3]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[1][2]=2
>>> a
[[0, 0, 2], [0, 0, 2], [0, 0, 2]]
请教各位大神,这个现象的原因是什么?如何初始化才能避免?
python的二维list问题
答案:2 悬赏:40
解决时间 2021-02-16 22:54
- 提问者网友:無奈小影
- 2021-02-16 10:24
最佳答案
- 二级知识专家网友:零负荷的放任
- 2021-02-16 10:54
list 的 乘法是将里面的对象复制了一遍,并没有创建新的对象(object)。比方说
b = [1, 2, 3]
b 是一个 list 对象,如果
a = [b]*3
那么a就是一个包含三个 b 的列表,这个列表中的每一个对象都是b,所以你修改任意一个对象,实际都是在修改 b本身。用 id() 可以查看对象id,你可以发现a中的每一个元素都是同一个id
>>> b = [0, 0, 0]
>>> id(b)
47599855534232
>>> a = [b]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> id(a)
47599860614424
>>> id(a[0])
47599855534232
>>> id(a[1])
47599855534232
>>> id(a[2])
47599855534232
>>> id(a[2]) == id(b)
True如果你想a中每一个元素都是不同的对象,可以用下面的代码:
a = [[0]*3 for i in range(3)]
b = [1, 2, 3]
b 是一个 list 对象,如果
a = [b]*3
那么a就是一个包含三个 b 的列表,这个列表中的每一个对象都是b,所以你修改任意一个对象,实际都是在修改 b本身。用 id() 可以查看对象id,你可以发现a中的每一个元素都是同一个id
>>> b = [0, 0, 0]
>>> id(b)
47599855534232
>>> a = [b]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> id(a)
47599860614424
>>> id(a[0])
47599855534232
>>> id(a[1])
47599855534232
>>> id(a[2])
47599855534232
>>> id(a[2]) == id(b)
True如果你想a中每一个元素都是不同的对象,可以用下面的代码:
a = [[0]*3 for i in range(3)]
全部回答
- 1楼网友:厭世為王
- 2021-02-16 11:14
在python中可以使用sorted函数对list进行排序,但是如果排序的对象是一个包含tuple的list时,sorted函数会使用tuple的第一个元素。
如果想要使用tuple的第二个元素进行排序,可以向sorted函数传入一个key参数,key参数必须是一个函数,输入是list的一个元素,输出最好是一个数字或简单的字符。
构造这样一个函数可以使用匿名函数lambda,示例代码如下:
mylist = [('dungeon',7),('winterfell',4),('bran',9),('meelo',6)]
print sorted(mylist, key=lambda x:x[1])
# [('winterfell', 4), ('meelo', 6), ('dungeon', 7), ('bran', 9)]
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯