Python论坛  - 讨论区

标题:[python-chinese] 嵌套list疑问

2005年07月09日 星期六 15:37

Person person.lee at gmail.com
Sat Jul 9 15:37:03 HKT 2005

举例一:
>>> s=[[0]*3]*2
>>> s
...[[0, 0, 0], [0, 0, 0]]
>>> s[0][2] +=1
>>> s
...[[0, 0, 1], [0, 0, 1]]
#咦,s[0][2]变成1,s[1][2]怎么也成1了!?

举例二:
>>> s = [range(3),range(4,7)]
>>> s
...[[0, 1, 2], [4, 5, 6]]
>>> s[0][2] +=1
>>> s
...[[0, 1, 3], [4, 5, 6]]
#这才正常:s[0][2]为2+1=3,s[1][2]没变!

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月09日 星期六 15:57

limodou limodou at gmail.com
Sat Jul 9 15:57:25 HKT 2005

这种问题基本上算是老生常谈了,建议你看一看以前的讨论。简单地说
[0]*3是对同一个对常重复3次,相当于是生成了三个指向同一个对象的引用。因此你使用一个引用来修改对象,对其它两个相当于同时改变了。而例二是不同的对象,因此对其中一个修改不会影响其它的对象。

象类似的问题还是去列表中或google中查一查,太多了。

在 05-7-9,Person<person.lee at gmail.com> 写道:
> 举例一:
> >>> s=[[0]*3]*2
> >>> s
> ...[[0, 0, 0], [0, 0, 0]]
> >>> s[0][2] +=1
> >>> s
> ...[[0, 0, 1], [0, 0, 1]]
> #咦,s[0][2]变成1,s[1][2]怎么也成1了!?
> 
> 举例二:
> >>> s = [range(3),range(4,7)]
> >>> s
> ...[[0, 1, 2], [4, 5, 6]]
> >>> s[0][2] +=1
> >>> s
> ...[[0, 1, 3], [4, 5, 6]]
> #这才正常:s[0][2]为2+1=3,s[1][2]没变!
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> 


-- 
I like python! 
My Donews Blog: http://www.donews.net/limodou
New Google Maillist: http://groups-beta.google.com/group/python-cn

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月09日 星期六 16:00

Person person.lee at gmail.com
Sat Jul 9 16:00:06 HKT 2005

再举一例!
举例三:
>>> s = [[0, 0, 0], [0, 0, 0]]
>>> s
[[0, 0, 0], [0, 0, 0]]
>>> s[0][2] +=1
>>> s
[[0, 0, 1], [0, 0, 0]]
原来问题出在*(重复运算)!可能因为重复的是引用,而不是值。
不知道这算bug,还是正常现象?

在 05-7-9,Person<person.lee at gmail.com> 写道:
> 举例一:
> >>> s=[[0]*3]*2
> >>> s
> ...[[0, 0, 0], [0, 0, 0]]
> >>> s[0][2] +=1
> >>> s
> ...[[0, 0, 1], [0, 0, 1]]
> #咦,s[0][2]变成1,s[1][2]怎么也成1了!?
> 
> 举例二:
> >>> s = [range(3),range(4,7)]
> >>> s
> ...[[0, 1, 2], [4, 5, 6]]
> >>> s[0][2] +=1
> >>> s
> ...[[0, 1, 3], [4, 5, 6]]
> #这才正常:s[0][2]为2+1=3,s[1][2]没变!
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月09日 星期六 16:04

Person person.lee at gmail.com
Sat Jul 9 16:04:21 HKT 2005

没想到这是个老生常谈的问题,谢谢limodou了!

在 05-7-9,limodou<limodou at gmail.com> 写道:
> 这种问题基本上算是老生常谈了,建议你看一看以前的讨论。简单地说
> [0]*3是对同一个对常重复3次,相当于是生成了三个指向同一个对象的引用。因此你使用一个引用来修改对象,对其它两个相当于同时改变了。而例二是不同的对象,因此对其中一个修改不会影响其它的对象。
> 
> 象类似的问题还是去列表中或google中查一查,太多了。
> 
> 在 05-7-9,Person<person.lee at gmail.com> 写道:
> > 举例一:
> > >>> s=[[0]*3]*2
> > >>> s
> > ...[[0, 0, 0], [0, 0, 0]]
> > >>> s[0][2] +=1
> > >>> s
> > ...[[0, 0, 1], [0, 0, 1]]
> > #咦,s[0][2]变成1,s[1][2]怎么也成1了!?
> >
> > 举例二:
> > >>> s = [range(3),range(4,7)]
> > >>> s
> > ...[[0, 1, 2], [4, 5, 6]]
> > >>> s[0][2] +=1
> > >>> s
> > ...[[0, 1, 3], [4, 5, 6]]
> > #这才正常:s[0][2]为2+1=3,s[1][2]没变!
> >
> > _______________________________________________
> > python-chinese list
> > python-chinese at lists.python.cn
> > http://python.cn/mailman/listinfo/python-chinese
> >
> >
> >
> 
> 
> --
> I like python!
> My Donews Blog: http://www.donews.net/limodou
> New Google Maillist: http://groups-beta.google.com/group/python-cn
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月09日 星期六 17:26

limodou limodou at gmail.com
Sat Jul 9 17:26:35 HKT 2005

多查查网上就知道了。我向大家公布一下我找到的两篇文章,内容另写。

在 05-7-9,Person<person.lee at gmail.com> 写道:
> 没想到这是个老生常谈的问题,谢谢limodou了!
> 
> 在 05-7-9,limodou<limodou at gmail.com> 写道:
> > 这种问题基本上算是老生常谈了,建议你看一看以前的讨论。简单地说
> > [0]*3是对同一个对常重复3次,相当于是生成了三个指向同一个对象的引用。因此你使用一个引用来修改对象,对其它两个相当于同时改变了。而例二是不同的对象,因此对其中一个修改不会影响其它的对象。
> >
> > 象类似的问题还是去列表中或google中查一查,太多了。
> >
> > 在 05-7-9,Person<person.lee at gmail.com> 写道:
> > > 举例一:
> > > >>> s=[[0]*3]*2
> > > >>> s
> > > ...[[0, 0, 0], [0, 0, 0]]
> > > >>> s[0][2] +=1
> > > >>> s
> > > ...[[0, 0, 1], [0, 0, 1]]
> > > #咦,s[0][2]变成1,s[1][2]怎么也成1了!?
> > >
> > > 举例二:
> > > >>> s = [range(3),range(4,7)]
> > > >>> s
> > > ...[[0, 1, 2], [4, 5, 6]]
> > > >>> s[0][2] +=1
> > > >>> s
> > > ...[[0, 1, 3], [4, 5, 6]]
> > > #这才正常:s[0][2]为2+1=3,s[1][2]没变!
> > >
> > > _______________________________________________
> > > python-chinese list
> > > python-chinese at lists.python.cn
> > > http://python.cn/mailman/listinfo/python-chinese
> > >
> > >
> > >
> >
> >
> > --
> > I like python!
> > My Donews Blog: http://www.donews.net/limodou
> > New Google Maillist: http://groups-beta.google.com/group/python-cn
> >
> > _______________________________________________
> > python-chinese list
> > python-chinese at lists.python.cn
> > http://python.cn/mailman/listinfo/python-chinese
> >
> >
> >
> 


-- 
I like python! 
My Donews Blog: http://www.donews.net/limodou
New Google Maillist: http://groups-beta.google.com/group/python-cn

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号