Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 未知原因导致变量更改_Python_Python 3.x - Fatal编程技术网

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