中易网

python的二维list问题

答案:2  悬赏:40  
解决时间 2021-02-16 22:54
>>> 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]]

请教各位大神,这个现象的原因是什么?如何初始化才能避免?
最佳答案
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)]
全部回答
在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)]
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
北京地铁10号线 为什么老出问题
挖掘机的电路板和电脑板一样吗?
北大优选学习法的里面主要讲解的是什么学习方
台球左赛与右赛的好处
小甘菊批号206018是哪年的
海沧区厦门富贵锁业我想知道这个在什么地方
旭日东升网咖桐城竞技馆这个地址在什么地方,
苹果手机充电口插了一个迷你小风扇之后充不进
怎样摊的煎饼果子比较干
中国古代说的“岭南”//“流放岭南”
男生变声后,还可以唱出童声一般的高音吗
什么样的鹿茸最好?
玲玲时尚潮流地址在什么地方,我要处理点事
怎么手动设置jvm heap的大小
一面缘小吃店怎么去啊,有知道地址的么
推荐资讯
淮北市钜峰新型建材有限公司这个地址在什么地
请问什么车的安全带是在头枕旁边的?
小狗偷吃狗粮了怎么办
女生的十大优点
哈基姆·奥拉朱旺的人物评价
累犯盗窃5万3判了5年半重吗
刘伯温是怎么死的
芒果如何成熟
历史上最大的大白鲨有多大?
验血指标,帮忙看一下。 应该注意什么!
求狮式重型坦克壁纸
雅芳专卖地址在什么地方,我要处理点事
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?