【问题标题】:Is there a Python equivalent of Perl's x operator (replicate string)?是否有 Python 等效于 Perl 的 x 运算符(复制字符串)?
【发布时间】:2009-01-30 20:27:49
【问题描述】:

在 Perl 中,我可以使用 'x' 运算符复制字符串:

$str = "x" x 5;

我可以在 Python 中做类似的事情吗?

【问题讨论】:

标签: python perl replicate


【解决方案1】:
>>> "blah" * 5
'blahblahblahblahblah'

【讨论】:

  • @S.Lott:没错。 SO 正在迅速成为懒惰的程序员阅读任何文档的替代方案。
  • 我同意,但我不认为这样做有什么害处。 (当我看到 S.Lott 的例子时,我不得不轻笑!)
  • “愚蠢的编程问题,由愚蠢的程序员回答。”谷歌搜索“python 等效 perl x”现在发现这个页面后跟达斯汀的朋友提要,然后什么都没有。我找不到文档的正确搜索词。
  • 我还注意到,与需要思考的复杂问题相比,我从提出愚蠢的问题中获得了更多的声誉积分。我猜这只是声誉系统中的一个缺陷。
  • @Mat:注意,我没有说这是一个愚蠢的问题。通过“懒惰的程序员”,我的意思是人们在发布到 SO 之前并没有非常努力地寻找或尝试解释器。也许这是一件好事,因为它表明 SO 在回答简单问题方面非常有效。
【解决方案2】:

这是对官方 Python3 文档的参考:

https://docs.python.org/3/library/stdtypes.html#string-methods

字符串实现所有common 序列操作...

...这导致我们:

https://docs.python.org/3/library/stdtypes.html#typesseq-common

Operation      | Result
s * n or n * s | n shallow copies of s concatenated

例子:

>>> 'a' * 5
'aaaaa'
>>> 5 * 'b'
'bbbbb'

【讨论】:

    【解决方案3】:

    在 Perl 中 (man perlop) xcalled repetition operator
    在 Python 3 中,此 * 也是 referred to 作为 repetition operator
    在 Python 2 中它可能被称为相同的东西,但我只在内置运算符下将 found it referred 改为 sequence repetition

    我认为离题很重要,字符串不是运算符的唯一用途;还有一些:

    • 字符串(好的,是的)
      • Perl "ab"x5 产生"ababababab"
      • Python "ab"*5 相同。
    • 列表
      • Perl @ones = (1) x @ones 分配每个数组元素而不重新分配引用。
      • Python ones = [1] * len(ones) 看起来像相同的结果,但重新分配了引用。
    • 列表列表:
      • Perl (0)x5 生成 ((0),(0),(0),(0),(0))
      • Python,差不多:[[0]]*5 [[0],[0],[0],[0],[0]]
    • 字典/哈希:
      • Perl:似乎不支持散列。您需要转换为列表并返回。
      • Python:dict 似乎也不支持。

    然而,正如上面“几乎”所暗示的那样,Python 中有一个警告(来自文档):

    >>> lists = [[]] * 3
    >>> lists
    [[], [], []]
    >>> lists[0].append(3)
    >>> lists
    [[3], [3], [3]]
    

    同样在 Perl 中,我不确定它记录在哪里,但空列表与运算符的行为有点不同,可能是因为它与 False 等效。

    @one=((1))x5;
    say(scalar @one); # 5
    @arr=(())x5;
    say(scalar @arr); # 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2012-02-08
      • 1970-01-01
      • 2017-11-29
      相关资源
      最近更新 更多