简单地说,为什么我会收到以下错误?
>>> yes = True
>>> 'no [{0}] yes [{1}]'.format((" ", "x") if yes else ("x", " "))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
我使用的是python 2.6。
答案 0 :(得分:15)
☞索引选项:
在格式字符串中访问参数的项时,应使用index来调用值:
yes = True
print 'no [{0[0]}] yes [{0[1]}]'.format((" ", "x") if yes else ("x", " "))
在调用tulple的索引时格式字符串中的 {0[0]}
等于(" ", "x")[0]
在调用tulple的索引
{0[1]}
等于(" ", "x")[1]
☞*
运算符选项:
或者您可以使用*
运算符来解包参数元组。
yes = True
print 'no [{0}] yes [{1}]'.format(*(" ", "x") if yes else ("x", " "))
在调用*
运算符时,如果if语句为'no [{0}] yes [{1}]'.format(*(" ", "x") if yes else ("x", " "))
,则'no [{0}] yes [{1}]'.format(" ", "x")
等于True
☞**
运算符选项(当你的var是dict时它的额外方法):
yes = True
print 'no [{no}] yes [{yes}]'.format(**{"no":" ", "yes":"x"} if yes else {"no":"x", "yes":" "})
答案 1 :(得分:8)
使用*
运算符,它接受一个可迭代的参数并将每个参数作为函数的位置参数提供:
In [3]: 'no [{0}] yes [{1}]'.format(*(" ", "x") if yes else ("x", " "))
Out[3]: 'no [ ] yes [x]'
答案 2 :(得分:6)
这里的问题是你只向string.format()
提供一个参数:一个元组。当您使用{0}
和{1}
时,您指的是传递给string.format()
的第0个和第1个参数。由于实际上没有第一个参数,因此会出现错误。
@Patrick Collins建议的*运算符可以工作,因为它解包了元组中的参数,将它们转换为单个变量。就好像你调用了string.format(“”,“x”)(或者反之)
@Tony Yang建议的索引选项是有效的,因为它引用传递给format()
的一个元组的各个元素,而不是试图引用第二个参数。