在python中,linter如何通过引用捕获副本?

在python中,linter如何通过引用捕获副本?,python,lint,Python,Lint,在对代码进行了一次大的修改(改变数据结构、算法和重构)之后,一个非常隐蔽的bug悄悄地出现了 self.shown=board[c.shown] 看起来很温和,我写这行的时候一刻也没想过。但是board恰好是一个numpy 2D数组,通过单个索引访问它会返回对列表的引用,而不是副本。这导致了全局状态修改。跟踪这一点非常令人厌烦,因为所有测试(单元和集成)都以优异的成绩通过。解决方案很简单,只需使用board.copy()创建本地版本即可。然而,我的问题是首先要防止这个bug,或者至少要限制调试

在对代码进行了一次大的修改(改变数据结构、算法和重构)之后,一个非常隐蔽的bug悄悄地出现了

self.shown=board[c.shown]
看起来很温和,我写这行的时候一刻也没想过。但是
board
恰好是一个numpy 2D数组,通过单个索引访问它会返回对列表的引用,而不是副本。这导致了全局状态修改。跟踪这一点非常令人厌烦,因为所有测试(单元和集成)都以优异的成绩通过。解决方案很简单,只需使用
board.copy()
创建本地版本即可。然而,我的问题是首先要防止这个bug,或者至少要限制调试时间


是什么让我意识到我将要做一些可能是无意的事情?什么样的linter/代码分析能够捕捉到这一点?

“然而,电路板恰好是一个numpy数组(列表列表)”-numpy数组和列表列表是完全不同的东西,具有非常不同的行为。你可能应该仔细阅读这些差异。我不认为获取引用会导致全局状态修改-我假设你在以后更改了
self.thrown
?我不知道linter如何“修复”这一点,因为获取一行的引用,然后在其他地方修改它是完全合理的。如果有一种“测试优先”的方法,那么“修改self.shown不影响电路板”测试可以在修改self.shown后立即编写。@user2357112supportsMonica-在这种情况下,列表的行为也会类似。用户将获得对内部列表的引用,而不是副本,任何修改都会影响这两者。但我同意numpy/熊猫等。。。经常出现意外行为。只是表示它不是一个一维数组。是的,我后来修改了
self.shown
,输入参数
board
被调用函数重新用于其他目的。不要求用门楣来修理任何东西——只是提醒一下。在某些情况下,这可能是有意的,但我很好奇,如果无意的情况下可以警告“然而,董事会碰巧是一个numpy数组(列表列表)”-numpy数组和列表是完全不同的事情,具有非常不同的行为。你可能应该仔细阅读这些差异。我不认为获取引用会导致全局状态修改-我假设你在以后更改了
self.thrown
?我不知道linter如何“修复”这一点,因为获取一行的引用,然后在其他地方修改它是完全合理的。如果有一种“测试优先”的方法,那么“修改self.shown不影响电路板”测试可以在修改self.shown后立即编写。@user2357112supportsMonica-在这种情况下,列表的行为也会类似。用户将获得对内部列表的引用,而不是副本,任何修改都会影响这两者。但我同意numpy/熊猫等。。。经常出现意外行为。只是表示它不是一个一维数组。是的,我后来修改了
self.shown
,输入参数
board
被调用函数重新用于其他目的。不要求用门楣来修理任何东西——只是提醒一下。在有些情况下,这可能是有意的,但我很好奇,是否可以警告无意的情况