我今天在Python中遇到了一个很奇怪的东西,即字符串和字典。有人可以向我解释为什么print语句在第一个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))
答案 0 :(得分:7)
两个循环都中断了。第一个只有 happens 起作用,这是因为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 :(得分:5)
对于字典情况,您正在迭代字典键。 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)
答案 2 :(得分:1)
for x,y in test:
print('%s %s' % (x,y))
由于test
是一个类似列表的对象(python中的字符串是类似列表的对象),因此对其进行迭代将依次获取每个字符。字符不是长度为2的类似列表的对象,因此尝试将其拆分为x
和y
会产生错误。
如果您有test = ("ab", "bc")
,则test将是一个包含成对字符的元组,可以使用上面的表达式进行拆分。
这是一个很短的答案,但我希望它可以澄清正在发生的事情。
在dict情况下起作用的原因稍微复杂一些,但不是很复杂。当您遍历python中的字典时,您实际上遍历了它的键。这意味着您有一个包含一个长度为2的字符串的项目的列表。如上所示,长度为2的字符串可以解压缩为它的第一个和第二个字符,这就是该语句起作用的原因。