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
zgoing
V2EX  ›  Python

python 小白,碰到一个坑,求助

  •  
  •   zgoing · 2015-04-29 14:34:45 +08:00 · 3856 次点击
    这是一个创建于 3498 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题简化一下,是这样的

    a = []
    b = []
    for i in range(10):
        b.append(i)
        a.append(b)
        print(a)
        print()
    

    两个数组,a 每次都增加一个数组 b,结果应该是[[0]], [[0], [0,1]], [[0], [0, 1], [0, 1, 2]].......
    可是实际结果是a里的每个元素都相等,成了 [[0]], [[0, 1], [0, 1]], [[0, 1, 2], [0, 1, 2], [0, 1, 2]]
    实在搞不懂,求大神帮助!!!

    22 条回复    2015-04-30 16:05:22 +08:00
    zgoing
        1
    zgoing  
    OP
       2015-04-29 14:36:18 +08:00
    缩进错了不显示了,其实应该是从第四行起全部缩进
    Mush
        2
    Mush  
       2015-04-29 14:36:43 +08:00
    没缩进的Python代码是完全没法看的......
    Livid
        3
    Livid  
    MOD
       2015-04-29 14:40:27 +08:00   ❤️ 1
    @zgoing 为你更新了一下帖子,下次请用 Markdown 发帖接口:

    https://www.v2ex.com/new

    并使用 Markdown 语法,这样帖子中的代码就可以高亮显示了。
    cloverstd
        4
    cloverstd  
       2015-04-29 14:46:08 +08:00
    因为 b 是一个数组,是引用
    id(a[0]) == id(b)
    cloverstd
        5
    cloverstd  
       2015-04-29 14:46:45 +08:00   ❤️ 2
    关键字应该是 python deep copy
    staticor
        6
    staticor  
       2015-04-29 15:01:06 +08:00   ❤️ 2
    改成 append(b[:])
    zgoing
        7
    zgoing  
    OP
       2015-04-29 15:04:26 +08:00
    @staticor 非常感谢,解决了!!
    zgoing
        8
    zgoing  
    OP
       2015-04-29 15:06:38 +08:00
    @Livid 谢谢!!
    lixia625
        9
    lixia625  
       2015-04-29 15:07:23 +08:00   ❤️ 1
    goodryb
        10
    goodryb  
       2015-04-29 15:11:26 +08:00   ❤️ 3
    你每次都是把b添加进去,相当于a[0]=b,a[1]=b ... a[n]=b,所以a中的每个元素都是相同的

    假设b=[0,1,2],a.append(b)和a.append([0,1,2])是不一样的,看下面的例子

    >>> b=[0,1,2]
    >>> b
    [0, 1, 2]
    >>> a=[]
    >>> a.append(b)
    >>> a.append([0,1,2])
    >>> a
    [[0, 1, 2], [0, 1, 2]]
    >>> b.append(3)
    >>> a
    [[0, 1, 2, 3], [0, 1, 2]]
    >>>
    twor2
        11
    twor2  
       2015-04-29 15:19:52 +08:00
    zgoing
        12
    zgoing  
    OP
       2015-04-29 19:05:52 +08:00
    @goodryb 感觉这个真是坑。。。
    zgoing
        13
    zgoing  
    OP
       2015-04-29 19:07:51 +08:00
    @twor2 这个好!不用import copy
    zgoing
        14
    zgoing  
    OP
       2015-04-29 19:13:28 +08:00
    @goodryb
    @twor2
    为什么在类里面 b.copy() 不管用呢
    zgoing
        15
    zgoing  
    OP
       2015-04-29 19:19:45 +08:00
    @lixia625 这个太具体了
    hansnow
        16
    hansnow  
       2015-04-29 22:12:34 +08:00 via iPhone
    我记得我在javascript里也遇到过类似的问题,原因就是b只是个地址
    Andrewliu
        17
    Andrewliu  
       2015-04-29 22:59:48 +08:00
    深浅拷贝问题,
    fanta
        18
    fanta  
       2015-04-30 09:52:41 +08:00
    还是你没有完理解Python 所至.
    zgoing
        19
    zgoing  
    OP
       2015-04-30 11:24:26 +08:00
    @fanta 嗯,是的,才学python
    fanta
        20
    fanta  
       2015-04-30 12:13:54 +08:00
    @zgoing 可以参考: https://github.com/qyuhen/book Python 笔记.
    FindHao
        21
    FindHao  
       2015-04-30 15:12:57 +08:00
    基本类型和引用类型的区别?
    zgoing
        22
    zgoing  
    OP
       2015-04-30 16:05:22 +08:00
    @fanta 好的,已经下了,准备好好学习!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5767 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:59 · PVG 10:59 · LAX 18:59 · JFK 21:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.