【问题标题】:Python - Using the Multiply Operator to Create Copies of Objects in Lists [duplicate]Python - 使用乘法运算符在列表中创建对象的副本 [重复]
【发布时间】:2009-10-22 04:30:22
【问题描述】:

在 Python 中,如果我将对象列表乘以一个整数,我会得到一个对该对象的引用列表,例如:

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

如果我想要的行为是创建原始对象的副本列表(例如,由“copy.copy()”方法或某种标准创建的副本,是否有 优雅 方式使用相同的乘法运算符?还是我应该坚持使用列表理解或其他东西?例如

[[] for x in range(0,3)]

任何版本的 Python 都可以。

【问题讨论】:

标签: python list


【解决方案1】:

这是列表理解的一个很好的用法 - 它也是 IMO 最易读的方式。

所以你建议的[[] for x in range(0,3)] 不是乘法运算符,而是得到你想要的结果。

【讨论】:

    【解决方案2】:

    序列上的乘法运算符意味着项目的重复——不是创建项目的副本(浅的或深的)。没有什么能阻止你发疯,唉:

    import copy
    
    class Crazy(object):
      def __init__(self, body, weird=copy.copy):
        self.gomez = body
        self.cousinitt = weird
      def __mul__(self, n):
        return [self.cousinitt(x) for x in (self.gomez * n)]
    
    a = Crazy([[]]) * 3
    

    ...除了你的理智和常识,如果有的话。检查这些,你梦寐以求的操作员* 的含义如何与它的预期含义完全不同,除非以奇怪的方式定义另一个重载__mul__ 的类...?-)

    【讨论】:

    • 虽然我理解您对这很奇怪的强调,但从 list 类继承不是更容易(并且更普遍有用),这样我们就完成了所有繁重的列表处理工作对我们来说,只需重载__mul__ 运算符即可进行复制?
    • 这个奇怪的例子让我失去了你的观点。
    • 不必粗鲁
    【解决方案3】:

    列表推导是最好的方法。如果你定义一个新类并重载 * 运算符,会严重混淆下一个人阅读代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-05
      • 2020-08-12
      • 2011-09-28
      • 2012-12-06
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多