【问题标题】:Enumerate with 'for'. Why doesn't it make an error? [duplicate]用“for”枚举。为什么它不会出错? [复制]
【发布时间】:2021-11-17 08:30:00
【问题描述】:

我知道 enumerate 函数分别给出了索引和元素。

for idx, batch in enumerate(['A', 'B', 'C']):
   print(batch[0]) 

结果:

A
B
C

没关系,而

print(batch[1]) 

出错,字符串索引超出范围。

我想问的是,

for idx, batch in enumerate(['A', 'B', 'C']):
   print(batch[0:6]) 

得到结果

A
B
C

尤其是,它不仅适用于 6。7,8 或任何大于 0(整数)的东西都会产生结果。

另外,batch[0:0] 没有出错。这是为什么呢?

【问题讨论】:

  • 不使用idx变量为什么还要使用枚举?
  • 如果batch是字符串'A'那么batch[0]是字符A,没有batch[1]
  • 这与enumerate或for循环无关;您可以只用一个字符串复制相同的行为。来自this answer on slices:“如果项目比你要求的少,Python 对程序员很友好。例如,如果你要求 a[:-2]a 只包含一个元素,你会得到一个空列表而不是错误。”
  • @CrazyChucky 从我的问题来看,batch[0:5] 的意思是:batch[0],batch[1]..... 然后batch[0] 没问题,但是当它去的时候batch[1],那为什么没有发生错误呢?所以你的意思是我只有一个空列表?
  • 正如我在链接和引用的答案中提到的,这就是切片在 Python 中的工作方式。 batch[1] 会抛出错误,是的。但是,如果您正在切片的序列用完项目,切片不会引发索引错误。

标签: python enumerate


【解决方案1】:

这与切片运算符对字符串的行为有关:

当您枚举字符串列表时,切片运算符作用于每个字符串。当切片运算符中的边界之一超出字符串的边界时,不会引发异常。切片运算符的边界被静默纠正。

例如,假设我们有字符串:

s = 'Hello World!'

然后s[6:20] 将生成“世界!”,即使20 超出了字符串的上限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多