我在野外发现了这段代码(在这里被简化了),我想知道这是否被认为是一种好的实践,也就是说,为了更新属性(并减少冗长?)而制作一个浅层副本(在本例中是对象的属性).我问是因为这不是我第一次看到这种模式,它让我有点不安.

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

board = DrawingBoard()
for x in np.arange(0, 10, 0.1):
    board.add_point(x, np.sin(x))

对于上下文,当添加了一定数量的点时,实际的类正在执行某些操作.在我第一次阅读时,我错过了这次更新(the code is a fair bit more complex).

我的问题是:是不是只有我不习惯这种模式,这仅仅是一个不那么冗长与清晰的问题?还是我还漏掉了什么我可以看到,如果我们更新多个属性,它可能会变得非常冗长,但我发现调用self.raw_points.append(Points(x,y))而不是points.append(Points(x,y))要清楚得多.

推荐答案

在你的例子中,没有任何类型的copy种,无论是浅的还是其他的.

points = self.raw_points等于points is self.raw_points.它使名称points成为self.raw_points引用的同一对象的附加引用,因此:

points.append(Points(x,y))

在功能上等同于:

self.raw_points.append(Points(x,y))

没有额外的self.raw_points属性查找的开销,这就是为什么如果要重复引用self.raw_points,这通常被认为是一个好的实践.

Python相关问答推荐

Pandas 密集排名具有相同值,按顺序排列

在有限数量的唯一字母的长字符串中,找到包含重复不超过k次的所有唯一字母的最长子字符串

重命名变量并使用载体中的字符串存储 Select 该变量

是否有方法将现有的X-Y图转换为X-Y-Y1图(以重新填充)?

Altair -箱形图边界设置为黑色,中线设置为红色

删除pandas rame时间序列列中未更改的值

如何在矩阵上并行化简单循环?

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

时间序列分解

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

如何从.cgi网站刮一张表到rame?

avxspan与pandas period_range

我对我应该做什么以及我如何做感到困惑'

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

未知依赖项pin—1阻止conda安装""

Django RawSQL注释字段

如何使用Numpy. stracards重新编写滚动和?

如何使用两个关键函数来排序一个多索引框架?

python panda ExcelWriter切换动态公式到数组公式

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道