2007年09月27日 星期四 19:47
>>> 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
2007年09月27日 星期四 20:46
l = [[0]*3 for i in range(3)]
2007年09月27日 星期四 20:56
恩,谢谢。 好像用循环往里面加就可以的。 但是不知道出现那种一列都被赋值的现象是怎么造成的。 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
2007年09月27日 星期四 22:12
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
2007年09月28日 星期五 09:46
哈哈,看 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 >
2007年09月28日 星期五 10:06
算是有点看明白了。 还真是花哨的特性啊。 但是对于 >>> 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
2007年09月28日 星期五 10:09
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
2007年09月28日 星期五 11:56
ËùνµÄ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
2007年09月28日 星期五 12:33
原来如此。 不过看起来还是显得有点古怪。 在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
2007年09月28日 星期五 12:41
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.
2007年09月28日 星期五 23:32
下面的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
2007年09月29日 星期六 00:45
如果从变量实际的存储角度考虑 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
Zeuux © 2025
京ICP备05028076号