为什么要使用格式字符串强制使用元组(或字典):
"%s %d" % ("text", 42)
以下会有什么不利之处?
"%s %d" % ["text", 42]
答案 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只使用格式化表达式中的元组来禁止这种混淆。通常,元组是一种列表,但它们是常量,您无法在适当的位置更改它们。这简化了调试程序的操作。