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



为什么元组(或字典)必须与格式字符串一起使用:

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

下面的缺点是什么?

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

我猜,但我希望这是因为GvR想要尽量减少'my object is: %s' % T(...)失败的不同类型T的数量。namedtuple s;-)

也就是说,允许'%s %s' % [1,2]为粗心的人创造了一个额外的陷阱,因为它阻止了您使用%s格式格式化[1,2]本身。

元组比列表访问起来更快,这使得它成为默认的

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

例如,考虑以下代码:
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在格式化表达式中只使用元组来避免这种混淆。通常,元组是列表的一种类型,但它们是常量,您不能就地更改它们。这实际上简化了调试程序的操作。

最新更新