为什么格式字符串不允许列表?

时间:2015-06-01 18:24:48

标签: python string format-specifiers

为什么要使用格式字符串强制使用元组(或字典):

"%s %d" % ("text", 42)

以下会有什么不利之处?

"%s %d" % ["text", 42]

3 个答案:

答案 0 :(得分:1)

我猜测,但我希望它是因为GvR希望最小化T失败的不同类型'my object is: %s' % T(...)的数量。它很糟糕,因为namedtuple s; - )

失败了

也就是说,允许'%s %s' % [1,2]为不警情的人创建额外的陷阱,因为它会阻止您使用[1,2]格式对%s本身进行格式化。

答案 1 :(得分:0)

元组的访问速度比列表快,这使其成为默认值

答案 2 :(得分:-1)

最有可能在格式化字符串时使用元组来解决歧义。也就是说,假设您有一个不可变对象,例如列表或字典,这些对象将来可能会发生变化,因此格式化可能会失败,或者格式化的方式可能与您预期的不同!实际上,元组的使用比使用列表要清晰得多,因为元组不能像列表那样在宫殿中更改。

例如,请考虑以下代码:

T = ("spam", "ham")

s = "%s and %s" % T

由于左对象是一个元组,因此您可以确保在程序运行时,操作永远不会通过操作就地更改,因此您可以放心使用。但是,并不是说使用元组是完全安全的,因为你可以做T += ("holy cow",)这样的事情,因此你会在你的元组中添加第三个项目,这会使表达式出错。但是元组比列表更改的可能性更小,因为它们是不可变对象。列表可能会在任何地方更改,谁知道该列表可能在百万行程序中的位置和时间发生变化?

请注意我们在此处使用列表时会发生什么:

L = ["spam", "ham"]
L.append("Ice-cream")        #line 103984.. above "%s and %s" % L 

s = "%s and %s" % L              #Error, three values in L  

您可能认为L仅包含"spam""ham",但实际上L包含在程序运行时从操作添加的另一个对象。您可能会在较小的系统中自己检测到此错误,但请考虑如果列表L用于巨型系统中的函数之间的状态保留,您将如何知道其值或可能发生的更改?更糟糕的是,您可能希望将s传递给函数以某种方式处理格式化字符串,如果它依赖于某些字符串格式,此函数将立即失败。如果除了特定的字符串格式之外没有它,它可能会处理您打算倒置的操作。

这可能是模棱两可的,因为您需要跟踪所有代码;当然,这在大型系统中是一项繁琐的工作。列表没有防范变更,反过来说,你应该像你一样改变和操纵列表。因为列表可以不时更改,Python只使用格式化表达式中的元组来禁止这种混淆。通常,元组是一种列表,但它们是常量,您无法在适当的位置更改它们。这简化了调试程序的操作。