Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 8346|回复: 19

[已解决]字典的一层嵌套与解套

  [复制链接]
发表于 2012-2-7 11:22 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2012-2-7 11:27 编辑

  1. Sub test()
  2.     Dim d As Object, k
  3.     Set d = CreateObject("scripting.dictionary")
  4.     d("E") = "Excel" '随便加一个条目,用于比较
  5.    
  6.     '把字典d本身,加入字典d。起两个别名:
  7.     '被装入的字典叫内字典
  8.     '装入后的字典叫外字典
  9.     d(d) = "记号"
  10.    
  11.     '导出外字典关键字
  12.     k = d.keys
  13.    
  14.     'k(1)相当于内字典对象,接着导出内字典关键字
  15.     k = k(1).keys
  16.    
  17.     '按说内字典里只有一个条目"E"
  18.     MsgBox UBound(k) '却发现,有2个元素:k(0)和k(1)
  19.    
  20.    
  21.     '如果继续下去,就像无底洞一样
  22.     k = k(1).keys
  23.     k = k(1).keys
  24.     k = k(1).keys
  25.     '....里面,永远存在"内字典"
  26.    
  27. End Sub
复制代码
请问:为什么在(1次)解套后,字典里面永远存在“内字典”?

PS:内字典,是我在本例中取的一个别名,因为内外字典是同一个字典,是为方便和外层的字典区分称呼)

最佳答案
2012-2-7 11:58
字典自身套自身啊。
当你赋值d(d) = "记号"

这时的KEYS的第二个元素也就是KEYS(1),是D这个对象啊,他含有两个元素啊,一个是E,一个是自己本身
你再取KEYS(1),又是取D本身,所以可以无限循环下去啊。
因为你字典套的是自己本身啊。不存在解套之说吧


不建议KEY中储存对象,因为所有的对象字典都认为是不同的[当然与你的问题没有关系]

评分

参与人数 2 +11 收起 理由
bbhiox + 1 很给力!
lisachen + 10 好问题

查看全部评分

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-2-7 11:54 | 显示全部楼层
嵌套的时候用另外一个字典来嵌套就不会出现这样的情况了.
感觉好像是镜子,对着镜子再拿一个镜子照的时候,就会出现无限循环的现象.把镜子背过来就不会这样了
回复

使用道具 举报

发表于 2012-2-7 11:58 | 显示全部楼层    本楼为最佳答案   
字典自身套自身啊。
当你赋值d(d) = "记号"

这时的KEYS的第二个元素也就是KEYS(1),是D这个对象啊,他含有两个元素啊,一个是E,一个是自己本身
你再取KEYS(1),又是取D本身,所以可以无限循环下去啊。
因为你字典套的是自己本身啊。不存在解套之说吧


不建议KEY中储存对象,因为所有的对象字典都认为是不同的[当然与你的问题没有关系]
回复

使用道具 举报

 楼主| 发表于 2012-2-7 12:08 | 显示全部楼层
Dj_soo 发表于 2012-2-7 11:54
嵌套的时候用另外一个字典来嵌套就不会出现这样的情况了.
感觉好像是镜子,对着镜子再拿一个镜子照的时候,就 ...

谢谢DJ
我照你说的,用外一个字典来嵌套,的确不存在了。这样对比是个好习惯。
镜子,我只能说,也曾有过这样的感觉,但自己说不清。
回复

使用道具 举报

 楼主| 发表于 2012-2-7 12:14 | 显示全部楼层
liuguansky 发表于 2012-2-7 11:58
字典自身套自身啊。
当你赋值d(d) = "记号"

谢谢liuguansky

看完你的解释,怎么想到了范伟那话:“乱了,乱了啊 ,我一个人滤滤 ...... 2000,2500,3000 ......”{:031:}

我感觉,肯定是有个很重要地方,我给搞错了,所以才有1楼"幻觉"。
你的解释能否具体的一步步列举,好对比学习一下
回复

使用道具 举报

发表于 2012-2-7 12:18 | 显示全部楼层
爱疯 发表于 2012-2-7 12:14
谢谢liuguansky !

看完你的解释,怎么想到了范伟那话:“乱了,乱了啊 ,我一个人滤滤 ...... 2000,2 ...

未命名.jpg
回复

使用道具 举报

 楼主| 发表于 2012-2-7 15:55 | 显示全部楼层
本帖最后由 爱疯 于 2012-2-7 16:02 编辑
liuguansky 发表于 2012-2-7 12:18


结论:
d(d) = "记号"这句以后,无论再读到哪一层字典,读到的都是当前字典

原因:
d(d) = "记号"这句以后,内字典被外字典替代(不复存在了)。

打个比方:
1) 一个公司名叫"d",它有一名下属叫"E"
2) 公司d被公司d收购
3) 公司d现有哪些下属?公司d事件说明是(有两名下属:e和d)
4) 如果要再问下属d里面是怎样的?查看下属d的事件说明仍是(有两名下属:e和d)。原因是,下属d和当前公司是同一对象。


回复

使用道具 举报

 楼主| 发表于 2012-2-7 16:00 | 显示全部楼层
又想了个比方:就像一个骗子说,我从下一句开始,不再说谎。

不知合适吗


回复

使用道具 举报

 楼主| 发表于 2012-2-7 16:10 | 显示全部楼层
我觉得:
8楼这样的情况,理应是一种错误。
而VBA却认为可以接受,于是出现了1楼的幻觉
回复

使用道具 举报

发表于 2012-2-8 00:00 | 显示全部楼层
  1. 'k(1)相当于内字典对象,接着导出内字典关键字
  2. k = k(1).keys
  3. '按说内字典里只有一个条目"E"
复制代码
外字典和内字典都是同一个对象d。
当外字典添加key的时候,内字典也同时会自动添加,即时更新。
所以,“按说内字典里只有一个条目"E"",这句话不正确。

另一例子:
对象作为key值,当对象某属性更改后,key仍认为为同一个对象:
  1. Sub cs()
  2.     Dim d As New Dictionary
  3.     d(Worksheets("sheet1")) = ""
  4.     Worksheets("sheet1").Name = "aaa"
  5.     Debug.Print d.Exists(Worksheets("aaa"))
  6.     Set d = Nothing
  7. End Sub
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-15 10:35 , Processed in 0.344755 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表