尝试迭代字符串中的字符时Python的行为

see*_*ker 2 python string iteration for-loop python-3.x

我试图使用循环迭代以下字符串for:

>>> for a,b,c in "cat"
        print(a,b,c)
Run Code Online (Sandbox Code Playgroud)

现在我打算做的是在一个物理线上单独打印字符串中的每个字符,而不是我收到错误.我知道通过将字符串包含在list运算符中可以很容易地解决这个问题[]:

>>> for a,b,c in ["cat"]
        print(a,b,c)
c a t
Run Code Online (Sandbox Code Playgroud)

但有人可以解释为什么会这样吗?

Mar*_*ers 7

您要告诉for我们扩展每个迭代值以分配给三个单独的变量:

for a,b,c in "cat":
#   ^^^^^ the target for the loop variable, 3 different names
Run Code Online (Sandbox Code Playgroud)

但是,对字符串的迭代会生成一个包含单个字符的字符串,您无法将单个字符分配给三个变量:

>>> loopiterable = 'cat'
>>> loopiterable[0]  # first element
'c'
>>> a, b, c = loopiterable[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 1)
Run Code Online (Sandbox Code Playgroud)

错误消息告诉您为什么这不起作用; 你不能从长度为1的字符串中取三个值.

当您将字符串放入列表时,您更改了循环的内容.您现在有一个包含一个元素的列表,因此循环只迭代一次,而单次迭代的值是字符串'cat'.该字符串恰好有3个字符,因此可以分配给三个变量:

>>> loopiterable = ['cat']
>>> loopiterable[0]  # first element
'cat'
>>> a, b, c = loopiterable[0]
>>> a
'c'
>>> b
'a'
>>> c
't'
Run Code Online (Sandbox Code Playgroud)

如果包含的字符串具有不同的字符数,这仍然会失败:

>>> for a, b, c in ['cat', 'hamster']:
...     print(a, b, c)
...
c a t
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)
Run Code Online (Sandbox Code Playgroud)

'hamster'是7个字符,而不是3个字符; 这太多了.

正确的解决方案是只使用一个变量的循环目标,而不是3:

for character in 'cat':
    print(character)
Run Code Online (Sandbox Code Playgroud)

现在,您将分别打印每个字符:

>>> for character in 'cat':
...     print(character)
...
c
a
t
Run Code Online (Sandbox Code Playgroud)

现在,如果您想将字符串的所有字符print()作为单独的参数传递,只需使用*扩展字符串以分隔调用的参数:

>>> my_pet = 'cat'
>>> print(*my_pet)
c a t
Run Code Online (Sandbox Code Playgroud)