假设我有一个列表 g(实际上是一个双重嵌套列表,它是三个维度,但为了清楚起见,这里将其简化为一维。)
g = [1,2,3,2,1]
我想要一个可以使 g[x] = g[x-1]+g[x] 的函数。不正确的方法是
def f(thing):
for x in xrange(0,len(thing)):
thing[x] += thing[x-1]
f(g)
这是错误的,因为它一个接一个地更新整数,而不是一次全部更新。另一种方法是复制 g。
gcopy = g[:]
def f(thing, copy):
for x in xrange(0,len(thing)):
thing[x] = copy[x]+copy[x-1]
g = gcopy[:]
f(g,gcopy)
如果 g 有对象,就像我的情况一样,copy.deepcopy(g)
似乎可以工作。
问题是复制成为我的性能瓶颈,而 deepcopy 的运行时间与我其余代码的总和一样长。
我在 SO 和 Google 上搜索了一些想法/解决方案,并集思广益,但似乎都没有希望。
此线程的答案:https ://stackoverflow.com/a/16711895/1858363建议返回对象而不是修改它们。我对这意味着什么感到困惑。返回修改后的对象有什么帮助?
我听说使用 deepcopy 复制对象的计算成本很高。如果这是真的,一个可能的解决方案是用列表替换对象并将对象的属性存储为列表中的整数和浮点数。由于我有子类和继承,这会使所有内容几乎不可读,并且可能会变得更加混乱。由于只有列表,因此希望可以对每个列表、子列表、子子列表等进行浅拷贝,然后重新组合它们。可能不是一个好的解决方案,而且加速是否很大值得怀疑(尽管我还没有测试过)。
总而言之,有没有一种方法可以更有效地同时更改列表中每个对象的值,无论是否复制列表?还是我坚持使用 deepcopy?谢谢!