新手学 python3.x,求构造[0,0,0……,0,0] ( 100 个零)的简便方法

2015-06-25 16:07:02 +08:00
 hjq98765
我都是
a=range(1,100)
b=range(1,100)
for i in a:
b[i]=b[i]-i
这样太笨了,有好的方法没?
4872 次点击
所在节点    Python
18 条回复
kkwezard
2015-06-25 16:09:08 +08:00
a = [0] * 100
hahastudio
2015-06-25 16:09:53 +08:00
你要的是
[0] * 100
还是
[0 for i in range(100)]
db253874
2015-06-25 16:09:55 +08:00
a = [0,] * 100
Azul
2015-06-25 16:11:13 +08:00
list(map(int, 100*'0')) 应该还有比这个好的吧
hjq98765
2015-06-25 16:12:53 +08:00
@kkwezard @hahastudio @db253874 多谢多谢,搞定了
hjq98765
2015-06-25 16:14:01 +08:00
@hahastudio 第一种方法看起来简单些
hahastudio
2015-06-25 16:16:46 +08:00
@hjq98765 第一种有坑,虽然 int 掉不进去,但是复杂类型就不要用第一种了,试试
a = [1,2]
b = [a] * 100
b[0].append(3)
hahastudio
2015-06-25 16:19:16 +08:00
@hjq98765 例子不太好,引用总是一样的,不过你可以试试
[[1,2]] * 10

[[1,2] for i in range(10)]
aiver
2015-06-25 17:36:07 +08:00
如@hahastudio说的,如果直接用[0]*100的做法有坑,推荐使用列表推导式构建[0 for i in range(100)]
lilydjwg
2015-06-25 19:31:25 +08:00
@aiver 看情况吧,如果是 immutable 的就乘了。或者:

from itertools import repeat
repeat(0, 100)

其实和乘是一样的。
weyou
2015-06-25 23:22:35 +08:00
就原题来讲,当然是a = [0] * 100最简单。
至于坑,那是另外的情况了。
zerh925
2015-06-26 00:08:26 +08:00
import numpy as np
a = np.zeros((1, 100)).tolist()[0]
just for fun
firemiles
2015-06-26 07:46:04 +08:00
@hahastudio 这个有什么问题吗,我在python2.7.9下运行是一样的,难道在3下改变了吗?
firemiles
2015-06-26 08:10:47 +08:00
@hahastudio 刚想明白了[[1,2]]*100产生的100个list指向相同的对象,修改其中一个时会改变其他99个
Yiph
2015-06-26 13:44:19 +08:00
@aiver 能否说一下具体是怎么样的坑啊……多谢。
aheadlead
2015-06-26 14:19:04 +08:00
@Yiph 至少python2下面是这样的

>>> class foo:
... pass
...
>>> s = foo()
>>> s.a = 233
>>> a = [s]*10
>>> a[0].a
233
>>> a[1].a
233
>>> a[2].a
233
>>>

a[0], a[1], ..., a[9] 都指向了同一个对象

>>> for item in a:
... print id(a)
...
4522747664
4522747664
4522747664
4522747664
4522747664
4522747664
4522747664
4522747664
4522747664
4522747664
>>>
aiver
2015-06-26 15:00:26 +08:00
@Yiph 如果乘的对象是 immutable ,那么这种方式就没问题,但如果是 mutable 的,你一旦改变了其引用的值,所有的结果都会变。具体如下:
a = [[1, 2], [3, 4]]
b = [a] * 3
此时b为:[[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]]
如果改变b引用的值:
b[0].append(0)
b所有乘的地方都会变,此时b为:[[1, 2, 0], [3, 4], [1, 2, 0], [3, 4], [1, 2, 0], [3, 4]]
而不只是b[0]发生了变化
Yiph
2015-06-26 15:03:47 +08:00
@aheadlead @aiver
谢谢!你们说得很明白。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/201112

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX