避免在Python中使用copy方法

0 投票
1 回答
950 浏览
提问于 2025-04-28 04:09

我写了一个用Python实现de Casteljau算法的函数。

from __future__ import division
import numpy as np
import copy

def decasteljau(P, t):
    N = len(P)
    for k in range(N-1):
        for r in range(N-1-k):
            P[r] = (1-t)*P[r] + t*P[r+1]
    return P[0]

然后我用以下数据调用了这个函数。

P = np.array([[1.,1.],[2.,3.],[3.,2.]], dtype=float)
M = 1000
for j in range(M):
    t = decasteljau(P, j/(M-1))

结果几乎所有的t = j/(M-1)值都得到了成千上万的(错误的)结果[3,2]。我把代码改成了:

def decasteljau(P, t):
    N = len(P)
    Q = copy.copy(P)
    for k in range(N-1):
        for r in range(N-1-k):
            Q[r] = (1-t)*Q[r] + t*Q[r+1]
    return Q[0]

这样我在改变数组P之前先复制了一份,现在数据是正确的。我其实不太明白为什么现在这样有效,我在想有没有不使用复制的方法来解决这个问题?谢谢!

这是没有使用复制方法的数据图和使用复制方法的数据图:

没有复制方法 这里输入图片描述

显然,第一个图是不正确的。第一个图的大部分点都在3,2,这不是我想要的结果。

暂无标签

1 个回答

1

问题在于,在Python中,你传递的是变量的链接,而不仅仅是值,所以你实际上是在修改原始列表。所有可变类型都是通过链接传递的。你可以在Python文档的数据类型部分了解更多信息。

如果你想避免使用复制函数,可以直接写

Q = P[:]

就这样简单 :-)

另外,这里有个不错的答案,讲解了如何正确复制列表

撰写回答