Python 字符串格式混乱

Python 字符串格式混乱,python,string-formatting,Python,String Formatting,MarkLutz的O'Reilly的《学习Python强大的面向对象编程》教授了格式化字符串的不同方法 下面的代码让我感到困惑。我将“ham”解释为在索引0处填充格式位置标记,但它仍然会在输出字符串的索引1处弹出。请帮助我了解到底发生了什么 代码如下: template = '{motto}, {0} and {food}' template.format('ham', motto='spam', food='eggs') 以下是输出: 'spam, ham and eggs' 我期望: '

MarkLutz的O'Reilly的《学习Python强大的面向对象编程》教授了格式化字符串的不同方法


下面的代码让我感到困惑。我将“ham”解释为在索引0处填充格式位置标记,但它仍然会在输出字符串的索引1处弹出。请帮助我了解到底发生了什么

代码如下:

template = '{motto}, {0} and {food}'
template.format('ham', motto='spam', food='eggs')
以下是输出:

'spam, ham and eggs'
我期望:

'ham, spam and eggs'

您唯一需要了解的是,
{0}
引用发送到
format()
的第一个(zeroeth)未命名的参数。通过删除所有未命名的引用并尝试使用线性填充,我们可以看到这种情况:

>>> "{motto}".format("boom")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'motto'
这里,
format()
正在参数列表中查找第二个未命名的参数,但该参数不存在,因此它会收到“元组索引超出范围”错误。这就是Python中传递的未命名(位置敏感)参数和命名参数之间的区别


您唯一需要了解的是,
{0}
引用发送到
format()
的第一个(零位)未命名的参数。通过删除所有未命名的引用并尝试使用线性填充,我们可以看到这种情况:

>>> "{motto}".format("boom")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'motto'
这里,
format()
正在参数列表中查找第二个未命名的参数,但该参数不存在,因此它会收到“元组索引超出范围”错误。这就是Python中传递的未命名(位置敏感)参数和命名参数之间的区别


我想你只是把自己弄糊涂了。你说的是对的“ham”是索引0,它取代了“{0}”。因此,
{monit},{0}和{food}
->
{monit},ham和{food}
“我将‘ham’解释为在索引0处填充格式位置标记”-不,它在占位符中填充了一个0。看看吧。我开始在这个混乱的小隧道的尽头看到了曙光;我最初的想法是字符串“ham”将出现在最终产品的索引0处,或输出的字符串。从OP所指出的,{0}似乎只是第0个未命名参数。我想你只是把自己弄糊涂了。你说的是对的“ham”是索引0,它取代了“{0}”。因此,
{monit},{0}和{food}
->
{monit},ham和{food}
“我将‘ham’解释为在索引0处填充格式位置标记”-不,它在占位符中填充了一个0。看看吧。我开始在这个混乱的小隧道的尽头看到了曙光;我最初的想法是字符串“ham”将出现在最终产品的索引0处,或输出的字符串。从OP所指出的,{0}似乎只是zeroeth未命名参数。zeroeth未命名参数解释帮助我理解。非常感谢。现在我回想起来,这本书确实说过这个例子同时使用了关键字和位置。非常感谢。现在我回想起来,这本书确实说过这个例子使用了关键字和位置。