我今天在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
正好是两个字符长,因此可以解压缩为两个变量x
和y
.
要遍历字典的键和值,请编写:
for k,v in d.items():
...
如果你只想要密钥,你可以这样做:
for k in d:
...
详细地说,当您遍历字典时,它会迭代键。
for x,y in test_dict
字典只有一个键,"ab"
.因此,在第一次也是唯一一次迭代中,它将该字符串分配给x
并y
,就好像您编写了以下内容一样:
x,y = "ab"
碰巧的是,这是一个有效的拆包。左边是两个变量,右边是两个项目的容器。x
变得"a"
,y
变得"b"
。
如果test
更长或更短,第一个循环也会崩溃,并显示"需要超过 N 个值才能解包"或"解包的值太多"。
为什么字符串在一种情况下解包,而在另一种情况下没有解包?
第二个循环直接循环"ab"
字符串。循环访问字符串时,它会将字符串分解为单字符字符串。第一次迭代"a"
,第二次迭代"b"
。在第一次迭代中,它尝试执行以下操作:
x,y = "a"
此赋值失败,并显示"需要超过 1 个值才能解压缩",因为左侧有两个变量,右侧只有一个字符。
对于字典情况,您正在迭代字典键。for x, y in test_dict
的意思是"对于test_dict
中的每个键,获取密钥并解压缩到变量x
和y
"。由于唯一的键是'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 的列表式对象,因此尝试将其拆分为x
和y
会产生错误。 如果您有test = ("ab", "bc")
那么测试将是一个包含字符对的元组,可以使用上面的表达式进行拆分。 这是一个非常简短的答案,但我希望它能澄清正在发生的事情。
这在字典案例中起作用的原因有点复杂,但不是很复杂。当你在python中迭代一个字典时,你实际上是在迭代它的键。这意味着您有一个项目的列表,这是一个长度为 2 的字符串。正如您在上面看到的,长度为 2 的字符串可以解压缩为其第一个和第二个字符,这就是该语句工作的原因。