Python 未知原因导致变量更改
但事实确实如此Python 未知原因导致变量更改,python,python-3.x,Python,Python 3.x,但事实确实如此 ONE: point(-1, -1) 有人能解释一下为什么之后会有点变化吗 ONE: point(-1, -1) TWO: point(0, 0) 状况 p、 抱歉,如果我的英语不好调用时,您会更改点内部函数someFunc的值 在if语句中,因此我希望在 结束。原因是您正在将引用(或“传递对象共享”)传递给函数,对它的任何更改都将在稍后反映出来。这与自动生成本地副本的“按值传递”方法不同 为了避免更改传入的原始点,可以在someFunc内创建一个局部变量 大概是这样的: i
ONE: point(-1, -1)
有人能解释一下为什么之后会有点变化吗
ONE: point(-1, -1)
TWO: point(0, 0)
状况
p、 抱歉,如果我的英语不好调用时,您会更改
点
内部函数someFunc
的值
在if语句中,因此我希望在
结束。原因是您正在将引用(或“传递对象共享”)传递给函数,对它的任何更改都将在稍后反映出来。这与自动生成本地副本的“按值传递”方法不同
为了避免更改传入的原始点
,可以在someFunc
内创建一个局部变量
大概是这样的:
if somePoint == someFunc(somePoint):
def someFunc(a#点):#注意新的参数名
loc_点=点(a_点.x,a_点.y)#新的局部点
如果定位点x>14:定位点x=14
elif loc_point.x<0:loc_point.x=0
如果定位点y>14:定位点y=14
elif loc_点y<0:loc_点y=0
返回定位点
另外,最好不要同时使用
point
引用类和参数。调用函数someFunc
时,可以更改point
内部函数的值
在if语句中,因此我希望在
结束。原因是您正在将引用(或“传递对象共享”)传递给函数,对它的任何更改都将在稍后反映出来。这与自动生成本地副本的“按值传递”方法不同
为了避免更改传入的原始点
,可以在someFunc
内创建一个局部变量
大概是这样的:
if somePoint == someFunc(somePoint):
def someFunc(a#点):#注意新的参数名
loc_点=点(a_点.x,a_点.y)#新的局部点
如果定位点x>14:定位点x=14
elif loc_point.x<0:loc_point.x=0
如果定位点y>14:定位点y=14
elif loc_点y<0:loc_点y=0
返回定位点
另外,最好不要同时使用point
引用类和参数。调用someFunc()
使用引用语义,因此它修改的对象正是使用它调用的对象。似乎您期望的是按值语义,即函数获取其传递的对象的副本。调用someFunc()
使用按引用语义,因此它修改的对象正是您使用它调用的对象。似乎您期望的是按值语义,即函数获取其传递的对象的副本。您正在更改somePoint
中的可变变量。您希望得到什么?与其在someFunc
中修改somePoint
,不如创建一个新的point对象并返回该对象进行比较。@JBernardo Mutability(此处)与对象相关,而不是与变量相关。。变量恰好命名了正在变异的(同一)对象。@pst一件事是变量的名称(point
),另一件事是变量本身的内容(point
实例或对象)。您正在somePoint
中更改可变变量。您希望得到什么?与其在someFunc
中修改somePoint
,不如创建一个新的point对象并返回该对象进行比较。@JBernardo Mutability(此处)与对象相关,而不是与变量相关。。变量恰好命名了正在变异的(同一)对象。@pst一个是变量的名称(point
),另一个是变量本身的内容(point
实例或对象)。我认为这里的关键点是在Python中,对象是通过引用传递的,而不是通过值传递的。在C++中,如果有类似的签名,我们会期望调用函数时复制一个点。但是在Python中,没有这样的副本。否。使用“通过参考传递”停止。这句话令人困惑,而且内容过重。语义更好,并且被明确地称为“对象共享调用”。(结束咆哮。)@pst我不认为“通过引用传递”令人困惑,但我也在我的答案中添加了你的术语,如果它有助于明确含义的话。就我个人而言,我更频繁地遇到了前者(也许是我的时代:)@Levon:我认为pst的意思是Python既不是按引用传递,也不是按值传递。“通过引用传递意味着(至少对某些程序员来说)你可以做C风格输出参数之类的事情。@Levon之所以让人困惑,是因为它有太多的含义和细微差别,它让我想到了一些我不需要的东西——引用。“和”C++中的参数(这实际上是“引用调用”)。C#中的out/ref(类似于C++中的引用参数)。Java(它使用“传递值[引用]”)。VB中的ByRef和ByVal(但后者也允许可变性)。JavaScript甚至没有在规范中使用“引用”一词……我认为这里的关键点是,在Python中,对象是通过引用传递的,而不是通过值传递的。在C++中,如果有类似的签名,我们会期望调用函数时复制一个点。但是在Python中,没有这样的副本。否。使用“通过参考传递”停止。这句话令人困惑,而且内容过重。语义更好,并且被明确地称为“对象共享调用”。(结束咆哮。)@pst我不认为“通过引用传递”令人困惑,但我也在我的答案中添加了你的术语,如果它有助于明确含义的话。就我个人而言,我更频繁地遇到了前者(也许是我的时代:)@Levon:我认为pst的意思是Python既不是按引用传递,也不是按值传递。“通过引用传递”意味着(至少对某些程序员而言)您可以执行类似于C样式输出参数的操作。@Levon之所以让人困惑,是因为它有太多的含义和细微差别,让我觉得
def someFunc(a_point): # note new parameter name
loc_point = point(a_point.x, a_point.y) # new local point
if loc_point.x > 14: loc_point.x = 14
elif loc_point.x < 0: loc_point.x = 0
if loc_point.y > 14: loc_point.y = 14
elif loc_point.y < 0: loc_point.y = 0
return loc_point