使用浅拷贝来更新对象的属性是Pythonic吗?

Joc*_*oca 2 python oop

我在野外发现了这段代码(这里进行了简化),我想知道这是否被认为是一个好的做法,也就是说,为了更新属性而制作浅拷贝(在本例中是对象的属性) (并减少冗长?)。我问这个问题是因为这不是我第一次看到这种模式,这让我有点困扰。

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))更清晰。

blh*_*ing 5

在您的示例中没有任何类型的副本(无论是浅层的还是其他形式)。

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要重复引用,这通常被认为是一个好的实践。