Ida_c 发表于 2020-11-27 22:09:00

fromkeys的用法,是创建一个新的字典?

4. 请目测下边代码执行后,字典dict1的内容是什么?
1. >>> dict1.fromkeys((1, 2, 3), ('one', 'two', 'three'))
2. >>> dict1.fromkeys((1, 3), '数字')

答:执行完成后,字典dict1的内容是:{1: '数字', 3: '数字'}
这里要注意的是,fromkeys方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,因为它会直接无情的用把整个字典给覆盖掉。


以上是老师的答案,我自己试验了一下:
>>> dict1={}
>>> dict1.fromkeys((1, 2, 3), ('one', 'two', 'three'))
{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
>>> dict1.fromkeys((1, 3), '数字')
{1: '数字', 3: '数字'}
>>> dict1
{}

怎么感觉老师的答案错了?

Twilight6 发表于 2020-11-27 22:13:40

本帖最后由 Twilight6 于 2020-11-27 22:14 编辑


甲鱼哥的意思是,如果先执行dict1.fromkeys((1, 2, 3), ('one', 'two', 'three'))

然后在执行dict1.fromkeys((1, 3), '数字') , 执行该代码后的内容是什么

如果 fromkeys 方法不是直接创建一个新的字典,而是在原字典上进行修改,那么第一次执行第一个代码时候结果为:1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}

那么第二次执行后代码一个是在原 1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')} 字典上进行改变的

显然,我们运行后会发现并不会,得到的结果是:{1: '数字', 3: '数字'},并不被第一行代码的执行所影响第二行代码的结果

所以得到答案的结论:fromkeys方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,因为它会直接无情的用把整个字典给覆盖掉。

小伤口 发表于 2020-11-27 22:13:53

老师说了呀fromkeys是创立一个新字典
所以最开始的dict1还是空的

kogawananari 发表于 2020-11-28 10:24:11

python 类语法中有三种方法,实例方法,静态方法,类方法
实例方法只能被实例对象调用
静态方法(由@staticmethod装饰的方法)、类方法(由@classmethod装饰的方法),可以被类或类的实例对象调用。
fromkeys方法是dict类的静态方法 和实例无关 所以无法影响到实例
类似的方法还有datetime.time.fromisoformat      datetime.datetime.now

Ida_c 发表于 2020-11-28 20:00:27

小伤口 发表于 2020-11-27 22:13
老师说了呀fromkeys是创立一个新字典
所以最开始的dict1还是空的

{1: '数字', 3: '数字'}算是dict1的内容吗?这应该算是新一个字典的内容?

小伤口 发表于 2020-11-28 20:29:42

{:10_256:} Ida_c 发表于 2020-11-28 20:00
{1: '数字', 3: '数字'}算是dict1的内容吗?这应该算是新一个字典的内容?

算新的
就像楼上说的
页: [1]
查看完整版本: fromkeys的用法,是创建一个新的字典?