首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

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

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

    from itertools import repeat
    repeat(0, 100)

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