这段代码为什么输出的结果是这样的?

def story(name, job):    print 'name -->',name,'job -->',job

params1 = {'python', 'language'}
params2 = {'language', 'python'}print story(*params1)print story(*params2)

结果:

name --> python job --> language
Nonename --> python job --> language
None

唔,输出None的问题我明白了。

长风秋雁
浏览 107回答 2
2回答

吃鸡游戏

print params1print params2你看看他们的输出是怎样的:set(['python', 'language'])set(['python', 'language'])

慕尼黑8549860

说下自己的理解楼主定义了二个set , 分别为 params1、params2,如下:params1 = {'python', 'language'}params2 = {'language', 'python'}打印params1、params2,结果显示:set(['python', 'language'])set(['python', 'language'])发现他们存储的顺序已经改变,所以猜测set数据结构会将其中的元素排序。所有的秘密都藏在源码里,所有我们翻看一下set的实现代码,查看Python安装目录下的Lib/sets.py文件,可以看到Set的定义class Set(BaseSet):    """ Mutable set class."""     __slots__ = []    # BaseSet + operations requiring mutability; no hashing     def __init__(self, iterable=None):        """Construct a set from an optional iterable."""         self._data = {}        if iterable is not None:             self._update(iterable) . . .可以发现元素是存在 _data[] 里 , 我们再查看一下它的插入元素函数    def add(self, element):        """Add an element to a set.         This has no effect if the element is already present.         """         try:             self._data[element] = True         except TypeError:             transform = getattr(element, "__as_immutable__", None)            if transform is None:                raise # re-raise the TypeError exception we caught             self._data[transform()] = True可以看到,插入元素element时,是将_data[element]设为True。所以元素的顺序就和map中定义的小于号有关。所以 , 下面的代码输出结果一样print story(*params1)print story(*params2)望指正
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python