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

有人碰到过这样诡异的事情吗?

  •  
  •   thedevil7 ·
    thedevil7 · 2012-04-28 21:10:08 +08:00 · 3007 次点击
    这是一个创建于 4599 天前的主题,其中的信息可能已经有所发展或是发生改变。
    groups 是一个列表, 里面的元素还是列表.
    grpNum 是 int, 等于 0.
    groups[grpNum].append(1)
    结果 groups = [ [1], [1], [1] ]
    本来只应该出现在第一个元素里面的1, 其余的元素里都有...

    我单独用 python3 测试过基本相同的语句, 没有这样的问题...

    源代码(错误代码用 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # 标出了)
    15 条回复    1970-01-01 08:00:00 +08:00
    tuoxie007
        1
    tuoxie007  
       2012-04-28 21:21:06 +08:00
    可能是一级数组中的指针指向了同一个[],建议检查一下id是否相同
    tuoxie007
        2
    tuoxie007  
       2012-04-28 21:23:44 +08:00
    如果是这样的话,换成list()试试,我在外面,没有命令行可以试
    quake0day
        3
    quake0day  
       2012-04-28 22:36:34 +08:00
    >>k=[]
    >>k.append([])
    >>k.append([])
    >>k.append([])
    >>k
    [[],[],[]]
    >>k[0].append(1)
    >>k
    [[1],[],[]]
    Python 2.7.3没问题
    reorx
        4
    reorx  
       2012-04-28 22:46:49 +08:00
    @tuoxie007 似乎只可能是这种情况,但列表作为可变对象,在创建的时候是不会查找缓存或出现重复的。[] is [] 得到的结果会是False,用不用list()都是一样的。这样说,我也没看出来问题出在哪里。。。
    yuelang85
        5
    yuelang85  
       2012-04-28 22:55:29 +08:00
    这个函数没有问题。

    检查下各个self.__groups的赋值语句?最好能把他们贴出来,尤其是self._groups的初始化语句。
    thedevil7
        6
    thedevil7  
    OP
       2012-04-28 22:56:58 +08:00
    @tuoxie007 id 一模一样。。。这个。。
    yuelang85
        7
    yuelang85  
       2012-04-28 23:01:12 +08:00
    @thedevil7 id一模一样说明是同一个对像哇。不过这个也说明不了啥,因为你这种情况除了自定义了append函数以外,基本上就是因为同一个对象。所以能不能把self._groups的初始化语句贴出来?
    binux
        8
    binux  
       2012-04-28 23:02:21 +08:00
    你是这么初始化的吧
    groups = [[]]*3
    yuelang85
        9
    yuelang85  
       2012-04-28 23:03:23 +08:00
    我最怀疑的,就是在初始化语句那里写了这么样的一段:

    self._group_amount = 10

    self._groups = [[]] * self._group_amount
    yuelang85
        10
    yuelang85  
       2012-04-28 23:03:49 +08:00
    @binux 哈哈哈,握爪
    thedevil7
        11
    thedevil7  
    OP
       2012-04-28 23:04:35 +08:00
    @binux 额...这个..确实是的...有问题?
    binux
        12
    binux  
       2012-04-28 23:06:06 +08:00   ❤️ 1
    @thedevil7 这么写是把引用拷贝了n次给你。。
    thedevil7
        13
    thedevil7  
    OP
       2012-04-28 23:06:31 +08:00
    @binux @yuelang85 @reorx @quake0day @tuoxie007
    谢谢各位, 问题被解决了 groups = [ [],[],[] ] 就没事了....
    这是怎么回事阿....求解释,求教育
    thedevil7
        14
    thedevil7  
    OP
       2012-04-28 23:09:04 +08:00
    @binux 原来是这样阿...真是坑爹阿..... 那重么写呢...
    难道 while i < 3 :
    . append([]) ?
    binux
        15
    binux  
       2012-04-28 23:11:19 +08:00   ❤️ 1
    @thedevil7 [[] for i in range(n)]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1960 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.