Chinaunix

标题: 如何声明100个字典类型的变量?? [打印本页]

作者: lemonniu    时间: 2008-09-27 17:00
标题: 如何声明100个字典类型的变量??
如题@@@
作者: izhier    时间: 2008-09-27 17:12
循环?
作者: luffy.deng    时间: 2008-09-27 17:23
a=[]
for i in range(0,100):
    a.append({})
作者: lemonniu    时间: 2008-09-28 16:20
原帖由 luffy.deng 于 2008-9-27 17:23 发表
a=[]
for i in range(0,100):
    a.append({})



good idea
作者: bohemia    时间: 2008-09-28 16:31
a=[{'key':'value'}]*100


虽然很无聊.呵呵.
作者: to407    时间: 2008-09-28 16:52
标题: 回复 #3 luffy.deng 的帖子
这个申请了又有何用。。。
作者: ghostwwl    时间: 2008-09-29 01:33
5楼的那样不对 这样实际只有一个字典 然后引用了若干次


  1. >>> a = [{1:'aaa'}]*3
  2. >>> a
  3. >>> [{1: 'aaa'}, {1: 'aaa'}, {1: 'aaa'}]
  4. >>> a[0][2] = 'bbb'
  5. >>> a
  6. >>> [{1: 'aaa', 2: 'bbb'}, {1: 'aaa', 2: 'bbb'}, {1: 'aaa', 2: 'bbb'}]
复制代码


所以是不对的
作者: yuanhen    时间: 2008-09-29 01:40
原帖由 ghostwwl 于 2008-9-29 01:33 发表
5楼的那样不对 这样实际只有一个字典 然后引用了若干次


>>> a = [{1:'aaa'}]*3
>>> a
>>> [{1: 'aaa'}, {1: 'aaa'}, {1: 'aaa'}]
>>> a[0][2] = 'bbb'
>>> a
>>> [{1: 'aaa', 2: 'bbb'}, {1: 'aaa',  ...



正确的是这样:a = [{}]*100

实在不理解LZ这样做的动机。

[ 本帖最后由 yuanhen 于 2008-9-29 01:42 编辑 ]
作者: ghostwwl    时间: 2008-09-29 02:49
楼上的 我举这个例子 就是 你这样看起来好像生成了100个空字典 实际上只有一个  空字典 其他的都是引用
昏死

你既然说  a = [{}]*100 正确 你试试
a[0]['1'] = 'bbbb 然后打印 a  看看结果
作者: luffy.deng    时间: 2008-09-29 10:06
5l的用法不对
作者: luffy.deng    时间: 2008-09-29 10:08
原帖由 to407 于 2008-9-28 16:52 发表
这个申请了又有何用。。。

可能lz需要100个字典
作者: izhier    时间: 2008-09-29 11:20
为何这个不可

  1. a=[]
  2. [a.append({}) for i in range(100)]
复制代码


知道了
原来 a.append({}) 返回的是 None
[a.append({}) for i in range(100)]
得到的是:
[None,None...]

a=[{},{}...]


[ 本帖最后由 izhier 于 2008-9-29 11:28 编辑 ]
作者: izhier    时间: 2008-09-29 11:23
这个也可以

  1. b=[{} for i in range(100)]
复制代码

作者: pumaboyd    时间: 2008-09-29 11:25
有意思,虽然不知道LZ要干嘛。但大家的回答还是学到了不少东西。a = [{1:'aaa'}]*3,a = [{}]*100 都是一样,都是引用。ghostwwl 是对的
作者: pumaboyd    时间: 2008-09-29 11:55
[{} for i in range(100)] nice
作者: guijia8427    时间: 2008-09-29 12:05

作者: leefurong    时间: 2008-09-30 16:24
标题: 回复 #16 guijia8427 的帖子
[b.append({}) for i in range(100)]
这样不好,因为利用了列表解析的副作用。
相比而言,
[{} for i in range(100)]
则要好看得多。

[{}] * 100肯定是错误的,因为[{}]是一个含有一个字典的列表,列表里的元素其实可以想成是字典的地址。
咱们把这个列表乘以100, 结果得到一个含有100个元素的列表。每个元素都是同样的地址。也就是说,里面虽然看起来有100个字典,其实是同一个字典的100个引用。

[{} for i in range(100)]则初始化了100次。每一次都新建了一个字典。
作者: searoom    时间: 2008-10-03 17:02
受益
作者: bohemia    时间: 2008-10-07 11:16
原帖由 leefurong 于 2008-9-30 16:24 发表

这样不好,因为利用了列表解析的副作用。
相比而言,
[{} for i in range(100)]
则要好看得多。

[{}] * 100肯定是错误的,因为[{}]是一个含有一个字典的列表,列表里的元素其实可以想成是字典的地址。
...



学习了.
[{}]*100 确实是引用;

[{} for i in range(100)]
这样的做法才Pythonic.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2