Python论坛  - 讨论区

标题:[python-chinese] 问一个二维list相关的问题

2007年09月27日 星期四 19:47

秦川 anewrer在gmail.com
星期四 九月 27 19:47:46 HKT 2007

>>> l = [3*[0]]*3
>>> l
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> l[1][1] = 2
>>> l
[[0, 2, 0], [0, 2, 0], [0, 2, 0]]

# 与之对比:
>>> k = [[0,0,0],[0,0,0],[0,0,0]]
>>> k[1][1] = 2
>>> k
[[0, 0, 0], [0, 2, 0], [0, 0, 0]]

请问这是什么原因?
如果我要简洁的定义一个list[list],怎样才能让它能够按照后者的方式工作?
谢谢
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070927/58e143d1/attachment.html 

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

2007年09月27日 星期四 20:46

cafeeee cafeeee在gmail.com
星期四 九月 27 20:46:53 HKT 2007

l = [[0]*3 for i in range(3)]

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

2007年09月27日 星期四 20:56

秦川 anewrer在gmail.com
星期四 九月 27 20:56:44 HKT 2007

恩,谢谢。
好像用循环往里面加就可以的。
但是不知道出现那种一列都被赋值的现象是怎么造成的。

2007/9/27, cafeeee <cafeeee在gmail.com>:
>
> l = [[0]*3 for i in range(3)]
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070927/db7cea55/attachment.html 

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

2007年09月27日 星期四 22:12

KnightPython knightpython在gmail.com
星期四 九月 27 22:12:27 HKT 2007

http://docs.python.org/lib/typesseq.html

(2)
Values of n less than 0 are treated as 0 (which yields an empty sequence of
the same type as s). Note also that the copies are *shallow*; nested
structures are not copied. This often haunts new Python programmers;
consider:

>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]

What has happened is that [[]] is a one-element list containing an empty
list, so all three elements of [[]] * 3 are (pointers to) this single empty
list. Modifying any of the elements of lists modifies this single list. You
can create a list of different lists this way:

>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]


ÔÚ07-9-27£¬ÇØ´¨ <anewrer在gmail.com> дµÀ£º
>
> ¶÷£¬Ð»Ð»¡£
> ºÃÏñÓÃÑ­»·ÍùÀïÃæ¼Ó¾Í¿ÉÒԵġ£
> µ«ÊDz»ÖªµÀ³öÏÖÄÇÖÖÒ»Áж¼±»¸³ÖµµÄÏÖÏóÊÇÔõôÔì³ÉµÄ¡£
>
> 2007/9/27, cafeeee <cafeeee在gmail.com>:
> >
> > l = [[0]*3 for i in range(3)]
>
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070927/0496dbd8/attachment.html 

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

2007年09月28日 星期五 09:46

FireBird ygonic在gmail.com
星期五 九月 28 09:46:48 HKT 2007

哈哈,看
len(l) ==3
我觉得l = [3*[0]]*3应该是:
[[[0, 0, 0]], [[0, 0, 0]], [[0, 0, 0]]]


在 07-9-27,秦川<anewrer在gmail.com> 写道:
> >>> l = [3*[0]]*3
> >>> l
> [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
> >>> l[1][1] = 2
> >>> l
> [[0, 2, 0], [0, 2, 0], [0, 2, 0]]
>
> # 与之对比:
> >>> k = [[0,0,0],[0,0,0],[0,0,0]]
> >>> k[1][1] = 2
> >>> k
> [[0, 0, 0], [0, 2, 0], [0, 0, 0]]
>
> 请问这是什么原因?
> 如果我要简洁的定义一个list[list],怎样才能让它能够按照后者的方式工作?
> 谢谢
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
>

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

2007年09月28日 星期五 10:06

秦川 anewrer在gmail.com
星期五 九月 28 10:06:01 HKT 2007

算是有点看明白了。
还真是花哨的特性啊。
但是对于
>>> k = [0]*3
>>> k[0] = 1
>>> k
[1, 0, 0]
这个shallow怎么就不起作用了呢?

在07-9-27,KnightPython <knightpython在gmail.com> 写道:
>
> http://docs.python.org/lib/typesseq.html
>
> (2)
> Values of n less than 0 are treated as 0 (which yields an empty sequence
> of the same type as s). Note also that the copies are *shallow*; nested
> structures are not copied. This often haunts new Python programmers;
> consider:
>
> >>> lists = [[]] * 3
> >>> lists
> [[], [], []]
> >>> lists[0].append(3)
> >>> lists
> [[3], [3], [3]]
>
> What has happened is that [[]] is a one-element list containing an empty
> list, so all three elements of [[]] * 3 are (pointers to) this single empty
> list. Modifying any of the elements of lists modifies this single list. You
> can create a list of different lists this way:
>
> >>> lists = [[] for i in range(3)]
> >>> lists[0].append(3)
> >>> lists[1].append(5)
> >>> lists[2].append(7)
> >>> lists
> [[3], [5], [7]]
>
>
> 在07-9-27,秦川 <anewrer在gmail.com> 写道:
> >
> > 恩,谢谢。
> > 好像用循环往里面加就可以的。
> > 但是不知道出现那种一列都被赋值的现象是怎么造成的。
> >
> > 2007/9/27, cafeeee <cafeeee在gmail.com >:
> > >
> > > l = [[0]*3 for i in range(3)]
> >
> >
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070928/21f5b166/attachment.htm 

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

2007年09月28日 星期五 10:09

秦川 anewrer在gmail.com
星期五 九月 28 10:09:34 HKT 2007

l = [[0]*3 for i in range(3)]
l = [[0]*3]*3
len(l)应该都是3的吧,这个是统计l中元素的个数的,不管是[[]]还是[]应该都被看作是一个元素的吧。

在07-9-28,FireBird <ygonic在gmail.com> 写道:
>
> 哈哈,看
> len(l) ==3
> 我觉得l = [3*[0]]*3应该是:
> [[[0, 0, 0]], [[0, 0, 0]], [[0, 0, 0]]]
>
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070928/819236bf/attachment-0001.html 

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

2007年09月28日 星期五 11:56

KnightPython knightpython在gmail.com
星期五 九月 28 11:56:56 HKT 2007

ËùνµÄdz¿½±´£¬¾ÍÊǽö½ö¿½±´¶ÔÏóµÄ×ÓÔªËØ£¬¶ø²»¿½±´×ÓÔªËصÄ×ÓÔªËØ¡£
ÏñÕûÐÍ¡¢²¼¶ûÐ͵ÄÊý¾Ý£¬ÆäÄÚ²¿Ã»ÓиüÉîµÄ²ã´ÎÁË£¬ËùÒÔdz¿½±´¾Í¿½±´ÁËËü±¾Éí¡£
>>> k = [0]*3
>>> k[0] = 1
¾ÍÏ൱ÓÚ£º
k = new Array(3);
k[0] = 0;
k[1] = 0;
k[2] = 0;
k[0] = 1;
ÏÔÈ»²»»áÓ°Ïìµ½ÆäËûÔªËØ¡£


¶øÏñÁÐ±í¡¢±íÁС¢É¢ÁÐ±í¡¢Àà¶ÔÏóÕâЩ¸´ÔÓÊý¾ÝÀàÐÍ£¬Ç³¿½±´¾ÍÖ»»á¿½±´¶ÔÏóµÄÒýÓ㬲»»á¸´ÖƶÔÏóµÄʵÀý¼°Æä×ÓÔªËØ¡£
>>> lists = [[]] * 3
>>> lists[0].append(3)
¾ÍÏ൱ÓÚ£º
sublist = new Array();
lists = new Array(3);
lists[0] = sublist;
lists[1] = sublist;
lists[2] = sublist;
lists[0].append(3)
listsµÄÈý¸ö×ÓÔªÆäʵ¶¼Ö¸Ïòsublist£¬¹ÊÐÞ¸ÄÈÎÒ»¸öÔªËض¼»áÓ°ÏìÆäËûÔªËØ¡£


ÔÚ07-9-28£¬ÇØ´¨ <anewrer在gmail.com> дµÀ£º
>
> ËãÊÇÓе㿴Ã÷°×ÁË¡£
> »¹ÕæÊÇ»¨ÉÚµÄÌØÐÔ°¡¡£
> µ«ÊǶÔÓÚ
> >>> k = [0]*3
> >>> k[0] = 1
> >>> k
> [1, 0, 0]
> Õâ¸öshallowÔõô¾Í²»Æð×÷ÓÃÁËÄØ£¿
>
> ÔÚ07-9-27£¬KnightPython <knightpython在gmail.com> дµÀ£º
> >
> > http://docs.python.org/lib/typesseq.html
> >
> > (2)
> > Values of n less than 0 are treated as 0 (which yields an empty sequence
> > of the same type as s). Note also that the copies are *shallow*; nested
> > structures are not copied. This often haunts new Python programmers;
> > consider:
> >
> > >>> lists = [[]] * 3
> > >>> lists
> > [[], [], []]
> > >>> lists[0].append(3)
> > >>> lists
> > [[3], [3], [3]]
> >
> > What has happened is that [[]] is a one-element list containing an empty
> > list, so all three elements of [[]] * 3 are (pointers to) this single empty
> > list. Modifying any of the elements of lists modifies this single list. You
> > can create a list of different lists this way:
> >
> > >>> lists = [[] for i in range(3)]
> > >>> lists[0].append(3)
> > >>> lists[1].append(5)
> > >>> lists[2].append(7)
> > >>> lists
> > [[3], [5], [7]]
> >
> >
> > ÔÚ07-9-27£¬ÇØ´¨ <anewrer在gmail.com> дµÀ£º
> > >
> > > ¶÷£¬Ð»Ð»¡£
> > > ºÃÏñÓÃÑ­»·ÍùÀïÃæ¼Ó¾Í¿ÉÒԵġ£
> > > µ«ÊDz»ÖªµÀ³öÏÖÄÇÖÖÒ»Áж¼±»¸³ÖµµÄÏÖÏóÊÇÔõôÔì³ÉµÄ¡£
> > >
> > > 2007/9/27, cafeeee < cafeeee在gmail.com >:
> > > >
> > > > l = [[0]*3 for i in range(3)]
> > >
> > >
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
Óù½£³Ë·çÀ´£¬³ýħÌìµØ¼ä£»
ÓоÆÀÖåÐÒ££¬ÎÞ¾ÆÎÒÒàµß£¡
Ò»Òû¾¡½­ºþ£¬ÔÙÒûÍÌÈÕÔ£»
ǧ±­×í²»µ¹£¬Î¨ÎҾƽ£ÏÉ£¡
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070928/bc763988/attachment.html 

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

2007年09月28日 星期五 12:33

秦川 anewrer在gmail.com
星期五 九月 28 12:33:51 HKT 2007

原来如此。
不过看起来还是显得有点古怪。

在07-9-28,KnightPython <knightpython在gmail.com> 写道:
>
> 所谓的浅拷贝,就是仅仅拷贝对象的子元素,而不拷贝子元素的子元素。
> 像整型、布尔型的数据,其内部没有更深的层次了,所以浅拷贝就拷贝了它本身。
> >>> k = [0]*3
> >>> k[0] = 1
> 就相当于:
> k = new Array(3);
> k[0] = 0;
> k[1] = 0;
> k[2] = 0;
> k[0] = 1;
> 显然不会影响到其他元素。
>
>
> 而像列表、表列、散列表、类对象这些复杂数据类型,浅拷贝就只会拷贝对象的引用,不会复制对象的实例及其子元素。
> >>> lists = [[]] * 3
> >>> lists[0].append(3)
> 就相当于:
> sublist = new Array();
> lists = new Array(3);
> lists[0] = sublist;
> lists[1] = sublist;
> lists[2] = sublist;
> lists[0].append(3)
> lists的三个子元其实都指向sublist,故修改任一个元素都会影响其他元素。
>
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070928/f49c343a/attachment.htm 

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

2007年09月28日 星期五 12:41

xxmplus xxmplus在gmail.com
星期五 九月 28 12:41:36 HKT 2007

if u kno anything about pointer, its easy to understand

On 9/28/07, 秦川 <anewrer at gmail.com> wrote:
> 原来如此。
> 不过看起来还是显得有点古怪。
>
> 在07-9-28,KnightPython <knightpython at gmail.com> 写道:
> > 所谓的浅拷贝,就是仅仅拷贝对象的子元素,而不拷贝子元素的子元素。
> > 像整型、布尔型的数据,其内部没有更深的层次了,所以浅拷贝就拷贝了它本身。
> > >>> k = [0]*3
> > >>> k[0] = 1
> > 就相当于:
> > k = new Array(3);
> > k[0] = 0;
> > k[1] = 0;
> > k[2] = 0;
> > k[0] = 1;
> > 显然不会影响到其他元素。
> >
> >
> > 而像列表、表列、散列表、类对象这些复杂数据类型,浅拷贝就只会拷贝对象的引用,不会复制对象的实例及其子元素。
> > >>> lists = [[]] * 3
> > >>> lists[0].append(3)
> > 就相当于:
> > sublist = new Array();
> > lists = new Array(3);
> > lists[0] = sublist;
> > lists[1] = sublist;
> > lists[2] = sublist;
> > lists[0].append(3)
> > lists的三个子元其实都指向sublist,故修改任一个元素都会影响其他元素。
> >
>
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to
> python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to
> python-chinese-request at lists.python.cn
> Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
>


-- 
Any complex technology which doesn't come with documentation must be the best
available.

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

2007年09月28日 星期五 23:32

杜严俊 jianzaishou在163.com
星期五 九月 28 23:32:46 HKT 2007

下面的id说明可能可以给大家一点启发
a = 1;
b = [a]
c = b * 2
d = [b] * 2

print id(a),id(c[0]),id(c[1])
11163448 11163448 11163448
print id(b),id(d[0]),id(d[1])
11821904 11821904 11821904
print id(c),id(d),
11840848 11850336

-----邮件原件-----
发件人: python-chinese-bounces在lists.python.cn
[mailto:python-chinese-bounces在lists.python.cn] 代表 xxmplus
发送时间: 2007年9月28日 12:42
收件人: python-chinese在lists.python.cn
主题: Re: [python-chinese]问一个二维list相关的问题

if u kno anything about pointer, its easy to understand

On 9/28/07, 秦川 <anewrer在gmail.com> wrote:
> 原来如此。
> 不过看起来还是显得有点古怪。
>
> 在07-9-28,KnightPython <knightpython在gmail.com> 写道:
> > 所谓的浅拷贝,就是仅仅拷贝对象的子元素,而不拷贝子元素的子元素。
> > 像整型、布尔型的数据,其内部没有更深的层次了,所以浅拷贝就拷贝了它本身。
> > >>> k = [0]*3
> > >>> k[0] = 1
> > 就相当于:
> > k = new Array(3);
> > k[0] = 0;
> > k[1] = 0;
> > k[2] = 0;
> > k[0] = 1;
> > 显然不会影响到其他元素。
> >
> >
> > 而像列表、表列、散列表、类对象这些复杂数据类型,浅拷贝就只会拷贝对象的引
用,不会复制对象的实例及其子元素。
> > >>> lists = [[]] * 3
> > >>> lists[0].append(3)
> > 就相当于:
> > sublist = new Array();
> > lists = new Array(3);
> > lists[0] = sublist;
> > lists[1] = sublist;
> > lists[2] = sublist;
> > lists[0].append(3)
> > lists的三个子元其实都指向sublist,故修改任一个元素都会影响其他元素。
> >
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
>


-- 
Any complex technology which doesn't come with documentation must be the
best
available.
_______________________________________________
python-chinese
Post: send python-chinese在lists.python.cn
Subscribe: send subscribe to python-chinese-request在lists.python.cn
Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese

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

2007年09月29日 星期六 00:45

杜严俊 jianzaishou在163.com
星期六 九月 29 00:45:32 HKT 2007

如果从变量实际的存储角度考虑
a = 1
b = [1]
c = b*2          //=[1,1]

结合其id值,a,b,c实际存储方式个人估计类似下面 
变量    类型标定     len  存储地址 储存内容       备注
a    整数(间接存储)  -      x01      x02     取出x11,进一步找出1  
       直接存储值     -      x02       1       直接存储   
b         列表        1      x03      x04
b[0]      列表元素    -      x04      x02     
c         列表        2      x05     x06 x07
c[0]      列表元素    -      x06      x02
c[0]      列表元素    -      x07      x02
d         列表        2      x08     x09 x0a
d[0]      列表元素    -      x09      x04
d[1]      列表元素    -      x0a      x04

解释原因
id(a),id(b[0]),id(c[0]),id(c[1])相同,说明其存储相同内容,多个存储同样的值,
肯定只能储存相同的地址。所以个人认为即使a=3这种似乎的直接赋值也不是真正直接
赋值,而是存储地址,间接存储。
同样id(b),id(c[0]),id(c[1])也是一样。

b=[a]似乎像是把a实际存储值(不是1)拷贝到b[0],而b存储b[0]的地址。
C=[a]*2这种方式像是把a的值拷贝到c[0],c[1],而c存储c[0],c[1]地址。
就类似c=[c[0],c[1]]=[a,a]=[a]*2,其他也类似。

理解其效果应该是自然的了。

我做ic的,有时关注的可能是具体RAM的每一位存储值是1还是0。上面是基于自己知识
的猜测。有不对,大家指正。

-----邮件原件-----
发件人: python-chinese-bounces在lists.python.cn
[mailto:python-chinese-bounces在lists.python.cn] 代表 杜严俊
发送时间: 2007年9月28日 23:33
收件人: python-chinese在lists.python.cn
主题: [python-chinese] 答复: 问一个二维list相关的问题

下面的id说明可能可以给大家一点启发
a = 1;
b = [a]
c = b * 2
d = [b] * 2

print id(a),id(c[0]),id(c[1])
11163448 11163448 11163448
print id(b),id(d[0]),id(d[1])
11821904 11821904 11821904
print id(c),id(d),
11840848 11850336

-----邮件原件-----
发件人: python-chinese-bounces在lists.python.cn
[mailto:python-chinese-bounces在lists.python.cn] 代表 xxmplus
发送时间: 2007年9月28日 12:42
收件人: python-chinese在lists.python.cn
主题: Re: [python-chinese]问一个二维list相关的问题

if u kno anything about pointer, its easy to understand

On 9/28/07, 秦川 <anewrer在gmail.com> wrote:
> 原来如此。
> 不过看起来还是显得有点古怪。
>
> 在07-9-28,KnightPython <knightpython在gmail.com> 写道:
> > 所谓的浅拷贝,就是仅仅拷贝对象的子元素,而不拷贝子元素的子元素。
> > 像整型、布尔型的数据,其内部没有更深的层次了,所以浅拷贝就拷贝了它本身。
> > >>> k = [0]*3
> > >>> k[0] = 1
> > 就相当于:
> > k = new Array(3);
> > k[0] = 0;
> > k[1] = 0;
> > k[2] = 0;
> > k[0] = 1;
> > 显然不会影响到其他元素。
> >
> >
> > 而像列表、表列、散列表、类对象这些复杂数据类型,浅拷贝就只会拷贝对象的引
用,不会复制对象的实例及其子元素。
> > >>> lists = [[]] * 3
> > >>> lists[0].append(3)
> > 就相当于:
> > sublist = new Array();
> > lists = new Array(3);
> > lists[0] = sublist;
> > lists[1] = sublist;
> > lists[2] = sublist;
> > lists[0].append(3)
> > lists的三个子元其实都指向sublist,故修改任一个元素都会影响其他元素。
> >
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
>


-- 
Any complex technology which doesn't come with documentation must be the
best
available.
_______________________________________________
python-chinese
Post: send python-chinese在lists.python.cn
Subscribe: send subscribe to python-chinese-request在lists.python.cn
Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese
_______________________________________________
python-chinese
Post: send python-chinese在lists.python.cn
Subscribe: send subscribe to python-chinese-request在lists.python.cn
Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese

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

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

    你的回复:

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

    Zeuux © 2025

    京ICP备05028076号