鱼C论坛

 找回密码
 立即注册
查看: 1278|回复: 5

[已解决]关于字典的一个疑惑,求大佬指点

[复制链接]
发表于 2018-1-20 20:08:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 天圆突破 于 2018-1-20 20:39 编辑

dict1 = {}
dict2 = {}
如果只用fromkeys()方法的话:
dict1.fromkeys(range(10))
这样不会给dict1赋值,dict1还是等于{}
必须要用
dict1 = dict1.fromkeys(range(10))
才能给dict1赋值
这样有什么意义呢?为什么非得加一个赋值,而不能像list.sort()那样,直接把值赋给dict1呢?

可能说的不清楚,再举个栗子:
dict1 = dict1.fromkeys(range(10))
dict1 = dict2.fromkeys(range(10))
dict1 = dict3.fromkeys(range(10))
dict1 = dict我特么必须得跟个字典.fromkeys(range(10))  
字典.png

不管右边fromkeys方法前面挂的是什么字典,左边生成的新字典,只跟方法里的变量有关系,而这个生成dict1字典过程,跟fromkeys方法前面挂的字典(dict2)没有一毛钱关系,也不会对前面挂的字典dict2产生任何影响。

换句话说,我要用fromkeys生成一个字典dict1:
我必须要在这个方法前面挂一个字典(dict2或dict1),而生成的新字典(dict1)和挂的这个字典(dict2)没有一毛钱关系,也不会对挂的这个字典(dict2)产生任何任何影响。


跟List.sort()那样不好么?不用跟赋值语句,直接就把过程给干了
这样设计不合理吧?还是有什么重要的意义我现在不能理解?
最佳答案
2018-1-20 20:38:13
classmethod fromkeys(seq[, value])
Create a new dictionary with keys from seq and values set to value.
fromkeys() is a class method that returns a new dictionary. value defaults to None.
这是官方文档的解释说明。
翻译出来就是:该方法为一个类方法,即可以直接通过类名调用(dict.fromkeys(...)),当然你也可以通过类的对象来调用。功能为通过给定的参数创建一个新的dict。如果通过一个对象来调用,的确和该对象没关系,不过该方法的设计者应该是想让你通过类名的方式来调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-20 20:38:13 | 显示全部楼层    本楼为最佳答案   
classmethod fromkeys(seq[, value])
Create a new dictionary with keys from seq and values set to value.
fromkeys() is a class method that returns a new dictionary. value defaults to None.
这是官方文档的解释说明。
翻译出来就是:该方法为一个类方法,即可以直接通过类名调用(dict.fromkeys(...)),当然你也可以通过类的对象来调用。功能为通过给定的参数创建一个新的dict。如果通过一个对象来调用,的确和该对象没关系,不过该方法的设计者应该是想让你通过类名的方式来调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-20 20:43:34 | 显示全部楼层
jewen 发表于 2018-1-20 20:38
classmethod fromkeys(seq[, value])
Create a new dictionary with keys from seq and values set to va ...


试了一下,果然如此。
而且发现,一个变量a事先不用初始化(a = {}),直接用a = dict.fromkeys()就能生成字典,不会报错。感谢指点!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-20 20:47:34 | 显示全部楼层
这两个函数的作用就是一个是直接改,一个是取列表里面的值然后返回另外一个列表。你把这两个概念搞混了。
你可以看下这两个函数的用法
sort:
http://www.runoob.com/python/att-list-sort.html
fromkeys:
http://www.yiibai.com/python/dictionary_fromkeys.html


顺便写了个例子给你,我用了函数的形式:
这个是你说的fromkeys的,估计差不多,一样的功能:
代码:
  1. def fromkeys(list,value=""):
  2.     dict = {}
  3.     for i in list:
  4.         dict[i]=value
  5.     return dict
  6. list1 = ["a","b","c"]
  7. print fromkeys(list1)
  8. print list1
复制代码

图片:
360截图1639041197108119.png

下面这个是sort,功能也差不多,我是用了排序数字的,如果是官方那个sort是根据ascii码排序的,我简单写了个函数:
代码:
  1. def sort(lists):
  2.     count = len(lists)
  3.     for i in range(0, count):
  4.         for j in range(i + 1, count):
  5.             if lists[i] > lists[j]:
  6.                 lists[i], lists[j] = lists[j], lists[i]
  7.     return lists
  8. list1=[2,6,67,3,1,33,77]

  9. print sort(list1)
  10. print list1
复制代码


图片:
360截图16490202474655.png




楼主你看出来了区别了吗?不是不赋值,只是调用了函数,一个是不动原利用原数据赋值给另外一个列表或者字典,一个是直接利用原数据修改后返回。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-20 20:55:44 | 显示全部楼层
桦少 发表于 2018-1-20 20:47
这两个函数的作用就是一个是直接改,一个是取列表里面的值然后返回另外一个列表。你把这两个概念搞混了。
...

可能我基础低,表述的不清楚,让您误解了我的意思。1楼已经解决了我的难题,还是很感谢你费了这么多功夫,也让我学到更多。非常感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-20 21:09:00 | 显示全部楼层
本帖最后由 天圆突破 于 2018-1-20 21:13 编辑

其实这个疑惑是来源于26讲的课后题4:
字典1.png
这道题出错了,因为没有赋值,所以fromkeys里面生成的字典不会传给dict1,dict1应该什么也没有 =.=,不仅如此,如果事先dict1没有声明是字典,会报错……
而且,26讲的视频里面,关于fromkeys的地方应该也讲错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 14:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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