我来自 C++,在使用 Python 编程时我很难获得安全感(例如拼写错误会造成极难发现的错误,但这不是重点)。在这里,我想了解如何通过坚持良好实践来避免做可怕的事情。
下面的简单函数在 c++ 中非常好,但在 Python 中创建了我只能称之为怪物的东西。
def fun(x):
x += 1
x = x + 1
return x
当我调用它时
var1 = 1;
print(fun(var1), var1)
var2 = np.array([1]);
print(fun(var2), var2)
我明白了
3 1
[3] [2]
除了缺乏同质行为(这已经很糟糕了),第二种情况特别可怕。外部变量仅由某些指令修改!
我详细地知道它为什么会发生。所以这不是我的问题。关键是,在构建一个复杂的程序时,我不想对所有这些依赖于上下文和高度隐含的技术细节格外小心。
必须有一些我可以严格遵守的良好做法,这将防止我无意中生成上面的代码。我可以想办法,但它们似乎使代码过于复杂,使 C++ 看起来像是一种更高级的语言。
我应该遵循什么好的做法来避免这种怪物?
谢谢!
[编辑] 一些澄清:我挣扎的是 Python 做出了一个依赖于类型和依赖于上下文的选择来创建一个临时的。再说一次,我知道规则。然而,在 C++ 中,选择是由程序员完成的,并且在整个函数中都是明确的,而在 Python 中并非如此。Python 要求程序员了解对参数执行的操作的相当多的技术细节,以便确定此时 Python 是在处理临时文件还是在原始文件上工作。
请注意,我构造了一个函数,它既返回一个值,又有一个副作用,只是为了说明我的观点。
关键是程序员可能希望编写该函数来简单地产生副作用(没有返回语句),并且在函数的中途 Python 决定构建一个临时函数,因此不应用一些副作用。另一方面,程序员可能不想要副作用,而是得到一些(并且难以预测的)。
在 C++ 中,上面的处理简单明了。在 Python 中,这是相当技术性的,需要知道什么触发了临时对象的生成,什么不触发。由于我需要向我的学生解释这一点,我想给他们一个简单的规则,以防止他们落入那些陷阱。