V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
hjq98765
V2EX  ›  Python

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

  •  
  •   hjq98765 · 2015-06-25 16:07:02 +08:00 · 4858 次点击
    这是一个创建于 3229 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我都是
    a=range(1,100)
    b=range(1,100)
    for i in a:
    b[i]=b[i]-i
    这样太笨了,有好的方法没?
    18 条回复    2015-06-26 15:03:47 +08:00
    kkwezard
        1
    kkwezard  
       2015-06-25 16:09:08 +08:00   ❤️ 1
    a = [0] * 100
    hahastudio
        2
    hahastudio  
       2015-06-25 16:09:53 +08:00   ❤️ 1
    你要的是
    [0] * 100
    还是
    [0 for i in range(100)]
    db253874
        3
    db253874  
       2015-06-25 16:09:55 +08:00   ❤️ 1
    a = [0,] * 100
    Azul
        4
    Azul  
       2015-06-25 16:11:13 +08:00   ❤️ 1
    list(map(int, 100*'0')) 应该还有比这个好的吧
    hjq98765
        5
    hjq98765  
    OP
       2015-06-25 16:12:53 +08:00
    @kkwezard @hahastudio @db253874 多谢多谢,搞定了
    hjq98765
        6
    hjq98765  
    OP
       2015-06-25 16:14:01 +08:00
    @hahastudio 第一种方法看起来简单些
    hahastudio
        7
    hahastudio  
       2015-06-25 16:16:46 +08:00   ❤️ 1
    @hjq98765 第一种有坑,虽然 int 掉不进去,但是复杂类型就不要用第一种了,试试
    a = [1,2]
    b = [a] * 100
    b[0].append(3)
    hahastudio
        8
    hahastudio  
       2015-06-25 16:19:16 +08:00
    @hjq98765 例子不太好,引用总是一样的,不过你可以试试
    [[1,2]] * 10

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

    from itertools import repeat
    repeat(0, 100)

    其实和乘是一样的。
    weyou
        11
    weyou  
       2015-06-25 23:22:35 +08:00
    就原题来讲,当然是a = [0] * 100最简单。
    至于坑,那是另外的情况了。
    zerh925
        12
    zerh925  
       2015-06-26 00:08:26 +08:00
    import numpy as np
    a = np.zeros((1, 100)).tolist()[0]
    just for fun
    firemiles
        13
    firemiles  
       2015-06-26 07:46:04 +08:00
    @hahastudio 这个有什么问题吗,我在python2.7.9下运行是一样的,难道在3下改变了吗?
    firemiles
        14
    firemiles  
       2015-06-26 08:10:47 +08:00
    @hahastudio 刚想明白了[[1,2]]*100产生的100个list指向相同的对象,修改其中一个时会改变其他99个
    Yiph
        15
    Yiph  
       2015-06-26 13:44:19 +08:00
    @aiver 能否说一下具体是怎么样的坑啊……多谢。
    aheadlead
        16
    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
        17
    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
        18
    Yiph  
       2015-06-26 15:03:47 +08:00
    @aheadlead @aiver
    谢谢!你们说得很明白。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2961 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 14:02 · PVG 22:02 · LAX 07:02 · JFK 10:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.