This question already has answers here:
List of lists changes reflected across sublists unexpectedly
(17个答案)
7年前关闭。
在Python中,如果我将对象列表乘以整数,则会得到对该对象的引用列表,例如:
如果我想要的行为是创建原始对象的副本列表(例如,通过“copy.copy()”方法或某种标准创建的副本),是否有一种优雅的方法可以使用相同的乘法运算符来做到这一点?我应该坚持列表理解还是其他?
任何版本的Python都可以。
...除了您的理智和常识之外,如果有的话。检查这些,如何使您梦operator以求的操作符
(17个答案)
7年前关闭。
在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
...除了您的理智和常识之外,如果有的话。检查这些,如何使您梦operator以求的操作符
*
的含义与预期的含义完全不同,除了通过以怪异的方式定义另一个重载__mul__
的类...?-)关于Python-使用乘法运算符在列表中创建对象的副本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1605024/
10-15 17:39