我正在python中创建一个机器学习算法。 说我有:
alg = DecisionTreeClassifier(random_state=1)
然后我创建一个函数拟合
def fit(X,Y,alg):
alg.fit(X,Y)
在我的主要部分我打电话
fit(X, Y, alg)
Y_pred = alg.predict(X_test)
这会有用吗?或者alg从未真正改变过外观?
我已阅读此问题How do I pass a variable by reference?,但由于我不知道我的变量alg
是如何更改的,因此令人困惑。
感谢您的帮助。
答案 0 :(得分:4)
是的,传递给该函数的模型对象是可变的,并且由fit
方法进行了变异。 Python的评估策略是call-by-sharing,因此更改将反映在调用者中。
通过共享进行呼叫(也称为按对象呼叫或通过呼叫进行呼叫) 对象共享)是一种首先由Barbara命名的评估策略 Liskov等。对于1974年的CLU语言。[5]它被语言使用 例如Python,[6] Iota,[7] Java(用于对象引用),Ruby, JavaScript,Scheme,OCaml,AppleScript等等。然而 术语"通过分享呼叫"不常用;术语是 不同来源不一致。例如,在Java中 社区,他们说Java是按价值呼叫的。通过分享来电话 意味着语言中的值基于对象而不是 原始类型,即所有值都是"盒装"。
共享呼叫的语义不同于参考呼叫 函数内函数参数的赋值是不可见的 调用者(与引用语义不同)[引用需要],所以 例如如果传递了变量,则无法模拟变量 在呼叫者的范围内对该变量进行分配。但是,自从 function可以访问与调用者相同的对象(没有副本 如果对象是可变的,那些对这些对象的突变 该函数对调用者可见,这看起来可能不同 来自价值语义的调用。一个可变对象的突变 函数对调用者可见,因为该对象未被复制或 克隆 - 它是共享的。