【问题标题】:Slicing where stop is larger than the string length在 stop 大于字符串长度的地方切片
【发布时间】:2021-10-20 01:03:33
【问题描述】:

我对 Python 如何处理 stop 属性大于我们正在使用的字符串长度的切片感兴趣,例如:

my_string = 'abc'
my_slice = my_string[:10]

我知道my_slice == 'abc',我感兴趣的是它的效率以及它是如何在幕后工作的。 我已阅读 Time complexity of string sliceUnderstanding slice notation,但没有找到我正在寻找的确切案例。

根据上述来源,我的猜测是返回字符串的浅拷贝(my_string[:10] 在这种情况下与 my_string[:] 相同),是这样吗?

【问题讨论】:

  • 在 CPython 解释器中缓存了小字符串,因此在这种情况下,my_string[:10]my_string[:] 很可能返回与 my_string 完全相同的 str 对象
  • @IainShelvington - 可能是标识符的小字符串 - 因此在字符串中包含空格(例如)意味着它们不会被缓存。
  • @TonySuffolk66 感谢您提供的信息。有趣的是,制作包含这样空格的字符串的“副本”仍然返回相同的对象,我猜在这种情况下,实现返回相同的对象作为优化

标签: python python-3.x string slice


【解决方案1】:

python 的逻辑是,它将提取列表中该索引之前的所有值。

因此,如果停止值高于列表的长度,它将返回整个列表,因为所有值的索引都在停止编号之下,因此它将提取所有值。

【讨论】:

    【解决方案2】:

    Python 中的切片遵循以下格式:

    myVar[fromIndex:toIndex]
    

    toIndex 标记的切片结束,计入其索引,即少一个字符:

    my_string = 'abc'
    print(my_string[2]) #Output: 'c'
    print(my_string[:2]) #Output: 'ab'
    

    如果我们设置的最终索引大于数据的字符长度,它将把它整个(它从第一个值打印到最后一个找到的值)。例如(按照您给出的示例):

    0 1 2 3
    a b c
    
    my_string = 'abc'
    print(my_string[:len(my_string)]) #Output: 'abc'
    

    通过下面的例子,你可以清楚地看到[:](是字符串的全长)相当于从字符串的开头到结尾切片打印值:

    0 1 2
    a b c
    
    my_string = 'abc'
    print(my_string[:]) #Output: 'abc'
    
    0 1 2 3
    a b c
    
    my_string = 'abc'
    print(len(my_string)) #Output: '3'
    print(my_string[:len(my_string)]) #Output: 'abc'
    

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 2020-05-03
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多