Python - 使用乘法运算符创建列表中的对象副本

Nic*_*ger 8 python list

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

>>> a = [[]] * 3
>>> a
[[], [], []]
>>> a[0].append(1)
>>> a
[[1], [1], [1]]
Run Code Online (Sandbox Code Playgroud)

如果我想要的行为是创建原始对象的副本列表(例如,通过"copy.copy()"方法或某种标准创建的副本,是否有一种优雅的方法可以使用相同的乘法运算符执行此操作?或者我应该坚持列表理解还是什么?例如

[[] for x in range(0,3)]
Run Code Online (Sandbox Code Playgroud)

任何版本的Python都可以.

Sha*_*son 11

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

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


Ale*_*lli 4

序列上的乘法运算符意味着重复项目 - 不创建项目的副本(浅或深).没有什么可以阻止你发疯,la:

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
Run Code Online (Sandbox Code Playgroud)

......除了你的理智和常识,如果有的话.检查那些,你梦寐以求的操作符*可能意味着与它意图完全不同的东西,除非__mul__以奇怪的方式定义另一个类重载...? - )

  • 虽然我理解你强调这是奇怪的,但是从`list`类继承是不是更容易(也更普遍有用),这样我们就可以为我们完成所有的grunt列表处理工作,并简单地重载` __mul__`运算符要复制吗? (2认同)
  • 没必要粗鲁 (2认同)