免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1675 | 回复: 7
打印 上一主题 下一主题

这个列表复制怎么才正确呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-24 09:41 |只看该作者 |倒序浏览
本帖最后由 aswjh 于 2012-08-24 09:46 编辑

我是初学python,边用边学,遇到一个问题,想初始化一个列表,含6个长度为10的子列表,我用a=[[0]*10]*6,然后赋值的话,比如a[0][2]=3,则a[0]-[5]的[2]都会变为3,用 is检查发现a[0]-[5]是同一个对象。如果用[[0]*10,[0]*10,[0]*10,[0]*10,[0]*10,[0]*10]初始化倒也可以,但似乎太笨了点,有什么简洁的方法实现吗?

论坛徽章:
0
2 [报告]
发表于 2012-08-24 10:58 |只看该作者
回复 1# aswjh

用numpy包,
  1. >>> from numpy import zeros
  2. >>> a=zeros((6,10))
  3. >>> a
  4. array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
  5.        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
  6.        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
  7.        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
  8.        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
  9.        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
  10. >>> a[1][1] +=1
  11. >>> a
  12. array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
  13.        [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
  14.        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
  15.        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
  16.        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
  17.        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-08-24 11:34 |只看该作者
回复 1# aswjh
a= [[0,]*10 for x in range(6)]

   

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
4 [报告]
发表于 2012-08-24 12:54 |只看该作者
回复 3# 106033177


    强大

论坛徽章:
0
5 [报告]
发表于 2012-08-24 13:09 |只看该作者
本帖最后由 aswjh 于 2012-08-24 13:17 编辑

不大用得到numpy包,用range实现似乎也有点麻烦,不过比我的方法强多了,先用着,谢谢两位

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
6 [报告]
发表于 2012-08-24 15:01 |只看该作者
106033177 发表于 2012-08-24 11:34
回复 1# aswjh
a= [[0,]*10 for x in range(6)]


颠覆了我对列表推导式的理解
一般情况下列表推导式中for后边的变量都会在前边被引用到
比如:
  1. a = [ i*i for i in range(5)]
复制代码
其中变量i在表达式i*i中被引用到。

还有在这个表达式中,既然后一个表达式[[0]*10]*6,得到的是对同一个列表引用六次的一个列表,改变其中一个的值,六个同时被更改。
那为什么前一个[0]*10得到的不是对同一个列表[0]的10次引用,得到十个对同一个列表[0]引用十次的列表?
  1. a=[[0]*10]*6
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-08-24 15:32 |只看该作者
后一个列表的元素是列表,是可变元素,前一个列表的元素是整数,是不可变元素回复 6# ssfjhh


   

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
8 [报告]
发表于 2012-08-24 17:37 |只看该作者
回复 7# xiaosay

多谢,明白了。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP