|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 from_now 于 2016-8-22 21:59 编辑
今天对列表进行乘法时,发现一个有趣的现象。
快速生成一个有重复元素的list可以用*表示。如下面:
- >>> c=[1,2,3]*3
- >>> c
- [1, 2, 3, 1, 2, 3, 1, 2, 3]
复制代码
生成后的list就是一个普普通通的列表,没区别。可以调用list元素,对元素进行改写等。
- >>> c[1]
- 2
- >>> c[1]='list'
- >>> c
- [1, 'list', 3, 1, 2, 3, 1, 2, 3]
- >>>
复制代码
但是,如果对多维list进行乘法,结果一定要注意了。如下面:
- >>> d=[[1,2,3]]*3
- >>> d
- [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
- >>>
复制代码
上面用乘法生成了一个多维的list,看上去普普通通。可以调用里面元素。
- >>> d[1]
- [1, 2, 3]
- >>> d[0][2]
- 3
- >>>
复制代码
但是对此list里面的一个元素重新赋值,发现所有复制来的元素全跟着改变了。
- >>> d[1][1]='wa~~'
- >>> d
- [[1, 'wa~~', 3], [1, 'wa~~', 3], [1, 'wa~~', 3]]
复制代码
这是不是python为了简便,实际上没有在内存中创建这个由乘法生成list,内存中只
保留原先本体list,运算后的list是其复制,只要本体list变了,都跟着变了?
本帖最后由 SixPy 于 2016-8-23 10:12 编辑
c=[1,2,3]*3 # 实际上是复制了3份 1、2、3 整数对象的指针
c[1]='list' # c[1]指针重新指向了 str对象,因为 整数是不可变对象,所以 其他 2 的值没变。
--------
d=[[1,2,3]]*3 # 实际是复制了 3份 同一个list对象的 指针。
d[1][1]='wa~~' # 改变 list元素的值,list是可变对象,所以,元素中的值变了,
|
|