我在野外发现了这段代码(这里进行了简化),我想知道这是否被认为是一个好的做法,也就是说,为了更新属性而制作浅拷贝(在本例中是对象的属性) (并减少冗长?)。我问这个问题是因为这不是我第一次看到这种模式,这让我有点困扰。
class DrawingBoard:
def __init__(self):
self.raw_points = []
def add_point(self, x, y):
Point = collections.namedtuple('Point', ['x', 'y'])
points = self.raw_points
points.append(Point(x, y))
if len(points) > ......:
# DO SOMETHING
Run Code Online (Sandbox Code Playgroud)
board = DrawingBoard()
for x in np.arange(0, 10, 0.1):
board.add_point(x, np.sin(x))
Run Code Online (Sandbox Code Playgroud)
对于上下文来说,当添加了一定数量的点时,实际的类正在执行一些操作。在我第一次阅读时,我错过了这次更新的发生(代码相当复杂)。
我的问题是:难道只有我不习惯这种模式,这只是一个简单与清晰的问题吗?还是我还缺少其他东西?我可以看到,如果我们更新多个属性,它可能会变得非常冗长,但我发现调用self.raw_points.append(Points(x,y))而不是points.append(Points(x,y))更清晰。
在您的示例中没有任何类型的副本(无论是浅层的还是其他形式)。
points = self.raw_points意思points 是 self.raw_points. 它使名称points成为对所引用的同一对象的附加引用self.raw_points,以便:
points.append(Points(x,y))
Run Code Online (Sandbox Code Playgroud)
在功能上等同于:
self.raw_points.append(Points(x,y))
Run Code Online (Sandbox Code Playgroud)
没有在 中查找额外属性的开销self.raw_points,这就是为什么如果self.raw_points要重复引用,这通常被认为是一个好的实践。