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

发布于 2021-01-29 19:36:33

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

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

如果我想要的行为是创建原始对象的副本列表(例如,通过“ copy.copy()”方法或某种标准创建的副本),是否有一种 优雅的 方法可以
使用相同的乘法运算符 来做到这一点?我应该坚持列表理解之类的吗?

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

任何版本的Python都可以。

关注者
0
被浏览
116
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    序列上的乘法运算符表示项目的重复-不会创建项目的副本(浅副本或深副本)。没什么可阻止您发疯的,啦!

    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__以怪异的方式定义另一个类重载之外,如何使您梦dream以求的DID意味着与预期的含义完全不同?



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看