为什么"in"适用于键而不适用于字符串?



我今天在Python中遇到了一个非常奇怪的字符串和字典。有人可以向我解释为什么打印语句在第一个 for 循环中有效但在第二个 for 循环中失败吗?

test = 'ab'
test_dict = {}
test_dict[test] = 1
for x, y in test_dict:
print('%s %s' % (x,y))
for x,y in test:
print('%s %s' % (x,y))

两个循环都断开了。第一个恰有效,因为非常特殊的巧合,test正好是两个字符长,因此可以解压缩为两个变量xy.

要遍历字典的键和值,请编写:

for k,v in d.items():
...

如果你只想要密钥,你可以这样做:

for k in d:
...

详细地说,当您遍历字典时,它会迭代键。

for x,y in test_dict

字典只有一个键,"ab".因此,在第一次也是唯一一次迭代中,它将该字符串分配给xy,就好像您编写了以下内容一样:

x,y = "ab"

碰巧的是,这是一个有效的拆包。左边是两个变量,右边是两个项目的容器。x变得"a"y变得"b"

如果test更长或更短,第一个循环也会崩溃,并显示"需要超过 N 个值才能解包"或"解包的值太多"。

为什么字符串在一种情况下解包,而在另一种情况下没有解包?

第二个循环直接循环"ab"字符串。循环访问字符串时,它会将字符串分解为单字符字符串。第一次迭代"a",第二次迭代"b"。在第一次迭代中,它尝试执行以下操作:

x,y = "a"

此赋值失败,并显示"需要超过 1 个值才能解压缩",因为左侧有两个变量,右侧只有一个字符。

对于字典情况,您正在迭代字典键。for x, y in test_dict的意思是"对于test_dict中的每个键,获取密钥并解压缩到变量xy"。由于唯一的键是'ab',字符串被解压缩为x = 'a'y = 'b'。当然,这特别有效,因为您唯一的字符串键的长度为 2。

对于字符串大小写,您正在迭代字符串。for x, y in test会失败。您不能说"对于test中的每个字符解压缩到多个变量",因为单个字符不是可迭代的。相反,您将遇到:

ValueError: not enough values to unpack (expected 2, got 1)
for x,y in test:
print('%s %s' % (x,y))

由于test是一个类似列表的对象(Python 中的字符串类似于列表(,因此迭代它依次需要每个字符。字符不是长度为 2 的列表式对象,因此尝试将其拆分为xy会产生错误。 如果您有test = ("ab", "bc")那么测试将是一个包含字符对的元组,可以使用上面的表达式进行拆分。 这是一个非常简短的答案,但我希望它能澄清正在发生的事情。

这在字典案例中起作用的原因有点复杂,但不是很复杂。当你在python中迭代一个字典时,你实际上是在迭代它的键。这意味着您有一个项目的列表,这是一个长度为 2 的字符串。正如您在上面看到的,长度为 2 的字符串可以解压缩为其第一个和第二个字符,这就是该语句工作的原因。

最新更新