将通过引用传递的参数复制到避免无意中修改参数的方法的最佳实践
Best practice for copying argument passed by reference to method that avoids unintentionally modifying argument
我执行以下代码行的目的是使用cv2在我的原始图像(即img)上绘制。据我所知,它这样做了但修改了 img (这是不需要的)。
cbImg = cv2.drawChessboardCorners(img, (nx, ny), corners, ret)
我理解Python是pass-by-reference,意思是参数可以被方法改变。为避免修改原图,需要对副本进行操作(如下图)
cbImg = cv2.drawChessboardCorners(copy.copy(img), (nx, ny), corners, ret)
我向 cv2.drawChessboardCorners() 传递了一份副本,因为我无法修改该方法。但是,我已经看到许多在方法内执行复制的示例。
是否有关于应该在何处进行复制的最佳做法?换句话说,如果我使用别人的方法,我是否应该始终传递一个副本以确保我的原始图像不被修改?或者,在编写我自己的方法时,我是否应该始终(或从不)在我的方法中执行复制以确保我不会无意中修改其他人的论点?此外,假设应该修改(或不修改)通过引用传递的参数通常是否可取?
最好的做法是让函数清楚地知道它们是否修改了参数。理想情况下,他们不会,因为这更容易推理。如果数据不大,可以选择创建和返回新值。
仅当您知道函数修改其参数的事实时才进行复制,并且您肯定需要原始值和修改后的值。
我执行以下代码行的目的是使用cv2在我的原始图像(即img)上绘制。据我所知,它这样做了但修改了 img (这是不需要的)。
cbImg = cv2.drawChessboardCorners(img, (nx, ny), corners, ret)
我理解Python是pass-by-reference,意思是参数可以被方法改变。为避免修改原图,需要对副本进行操作(如下图)
cbImg = cv2.drawChessboardCorners(copy.copy(img), (nx, ny), corners, ret)
我向 cv2.drawChessboardCorners() 传递了一份副本,因为我无法修改该方法。但是,我已经看到许多在方法内执行复制的示例。
是否有关于应该在何处进行复制的最佳做法?换句话说,如果我使用别人的方法,我是否应该始终传递一个副本以确保我的原始图像不被修改?或者,在编写我自己的方法时,我是否应该始终(或从不)在我的方法中执行复制以确保我不会无意中修改其他人的论点?此外,假设应该修改(或不修改)通过引用传递的参数通常是否可取?
最好的做法是让函数清楚地知道它们是否修改了参数。理想情况下,他们不会,因为这更容易推理。如果数据不大,可以选择创建和返回新值。
仅当您知道函数修改其参数的事实时才进行复制,并且您肯定需要原始值和修改后的值。