0

我正在阅读一本名为“Head First Programming”的书,其中有一个特定部分让我对他们为什么要这样做感到困惑。
似乎没有任何理由,文本中也没有任何解释。

有问题的问题是使用多重赋值将字符串中的拆分数据分配到哈希中(如果您问我,这对于他们为什么使用哈希没有意义,但这是一个单独的问题)。这是示例代码:

line = "101;Johnny 'wave-boy' Jones;USA;8.32;Fish;21"
s = {}
(s['id'], s['name'], s['country'], s['average'], s['board'], s['age']) = line.split(";")

我知道这将获取字符串line并将其拆分为每个命名部分,但我不明白为什么我认为的键是通过使用字符串来命名的,而在几页之前,它们被命名为任何其他变量,没有单引号。
各个部分的目的是基于单个元素进行搜索,然后打印在屏幕上。例如,能够通过 ID 号进行搜索,然后返回整个事物。

有问题的语言是 Python,如果这有什么不同的话。这对我来说相当混乱,因为我正在尝试自己学习这些东西。
我个人最好的猜测是它没有任何区别,而且这是部分作者的个人喜好,但令我感到困惑的是,他们会突然改变这种形式而没有任何意义,并且进一步困扰我他们没有不用解释了。

编辑:所以我尝试id在名称周围打印带单引号和不带单引号的密钥,无论哪种方式,它都工作得很好。因此,我不得不假设这是个人喜好问题,但我仍然希望从真正知道他们在做什么的人那里得到一些信息,从长远来看它是否真的会有所作为。

编辑 2: 显然,我的 Python 解释器实际上是如何使用我给它的东西没有任何意义,所以我做了一个屏幕截图,它工作https://www.youtube.com/watch? v=52GQJEeSwUA

4

2 回答 2

2

实际上,事实证明,对于字典(Python 中的哈希术语),有引号和没有引号之间存在语义差异。

例如:

s = {}
s['test'] = 1
s['othertest'] = 2

定义了一个名为 s 的字典,它有两个键,'test' 和 'othertest'。但是,如果我尝试这样做:

s = {}
s[test] = 1

我会得到一个 NameError 异常,因为这将寻找一个名为 test 的未定义变量,其将用作键。

如果,那么,我要在 Python 解释器中输入这个:

>>> s = {}
>>> s['test'] = 1
>>> s['othertest'] = 2
>>> test = 'othertest'
>>> print s[test]
2
>>> print s['test']
1

您将看到使用 test 作为不带引号的键使用该变量的值来查找字典 s 中的关联条目。

编辑:现在,真正有趣的问题是为什么使用 s[id] 会给你你所期望的。关键字“id”实际上是 Python 中的一个内置函数,它为作为参数传递的对象提供唯一的 id。Python 解释器在世界上对表达式 s[id] 做了什么对我来说完全是个谜。

编辑 2:观看 OP 的 Youtube 视频,很明显他在分配和读取关于使用 id 或 'id' 的哈希时保持一致,所以函数 id 作为哈希键没有问题,不知何故神奇地与 'id' 对齐一个哈希键。这让我有一段时间有点担心。

于 2013-08-23T09:28:42.660 回答
2

我不明白为什么我认为键是通过使用字符串来命名的,而仅仅在几页之前,它们就像任何其他变量一样被命名,没有单引号

答案就在那里。如果没有引号,mydict[s]则 ,s 一个变量,您可以根据 dict 的值在 dict 中查找键s

如果它是一个字符串,那么你会逐字查找那个键。

因此,在您的示例s[name]中不起作用,因为它会尝试访问name可能未设置的变量。

编辑:所以我尝试在名称周围打印带单引号和不带单引号的 id 键,无论哪种方式,它都工作得很好。

那只是纯粹的运气......有一个名为的内置函数id

>>> id
<built-in function id>

尝试其他名称,您会发现它不起作用。

于 2013-08-23T09:29:28.217 回答