当前位置: 首页 > 面试题库 >

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

楚皓君
2023-03-14
问题内容

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

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

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

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

任何版本的Python都可以。


问题答案:

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

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意味着与预期的含义完全不同?



 类似资料:
  • 有可能使用@Configurable类那 我知道用@Autowired和@Resource等是可能的...还有其他的吗? 如。 然后像这样 除了能够使用<code>new</code>操作符创建<code>MyObj</code>并仍然让spring处理注释之外,还有其他选择吗? ——编辑: 在使用@Autowired时,可以使用来做到这一点,看看一些带有Spring和AOP的Hibernate和

  • 问题内容: 这个问题已经在这里有了答案 : 如何进行列表理解中的作业? (6个答案) 4年前关闭。 我不确定在循环中使用运算符时为什么不能在列表理解中使用运算符? 问题答案: 赋值运算符(及其上的所有变体)在Python中构成一个 语句 ,而不是一个 expression 。不幸的是,列表推导(以及其他推导,如集合,字典和生成器)仅支持表达式。

  • 我想列个这样的单子。请帮帮我.谢了。

  • 问题内容: 我最近了解了python中的运算符重载,并且我想知道以下情况是否可能。 考虑以下假设/人为的类。 我知道上面写的方式,我可以做这样的事情 这些将按预期工作。我也知道目前的书写方式我无法做到这一点 有没有办法解决?我知道这个例子是人为设计的,但是我有一个应用程序,如果当我进行运算符重载时,为它定义运算符的类可以出现在运算符的右侧,它将非常有用。这可能在python中吗? 问题答案: 是。

  • 问题内容: 我正在阅读《如何像计算机科学家一样思考》,这是“ Python编程”的介绍性文字。 我想弄清楚将乘法运算符()应用于列表时的行为。 考虑函数 make_matrix 实际输出为 make_matrix 的正确版本 是: make_matrix的 第一个版本失败的原因(如9.8中的说明)是 …每行是其他行的别名… 我想知道为什么 原因 …每行是其他行的别名… 但不是 即为什么一行中的每个

  • 问题内容: 假设我有一个给定的对象(字符串“ a”,一个数字-假设为0或一个列表) 我想创建一个包含该对象许多副本的列表,但不使用for循环: 要么 要么 我对第三种情况特别感兴趣。谢谢! 问题答案: 是你的朋友。 请注意,在第三种情况下,由于列表是通过引用引用的,因此更改列表中[‘x’,’y’]的一个实例将更改所有它们,因为它们均引用同一列表。 为了避免引用相同的项目,您可以改用理解来为每个列表