变化原因不明

时间:2012-05-25 16:19:19

标签: python python-3.x

#it's python 3.2.3
class point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, point):
        return self.x == point.x and self.y == point.y

    def __str__(self):
        return 'point(%s, %s)' % (self.x, self.y)

def someFunc(point):
    if point.x > 14: point.x = 14
    elif point.x < 0: point.x = 0

    if point.y > 14: point.y = 14
    elif point.y < 0: point.y = 0

    return point

somePoint = point(-1, -1)
print('ONE: %s' % somePoint)
if somePoint == someFunc(somePoint):
    print('TWO: %s' % somePoint)

我看到首先 print()后没有 somePoint 变量分配 但在 if 语句

之后,变量 somePoint 会神奇地改变

该程序的输出应为

ONE: point(-1, -1)

但它是

ONE: point(-1, -1)
TWO: point(0, 0)

有人可以解释为什么某些点在

之后发生了变化
if somePoint == someFunc(somePoint):

条件?

P.S。抱歉,如果我的英语不好

2 个答案:

答案 0 :(得分:4)

调用它时,您可以更改函数pointsomeFunc的值 在你的if语句中,所以我希望该值为(0,0) 结束。原因是您正在将引用(或“按对象共享传递”)传递给该函数,稍后将对其进行任何更改。这与pass-by-value方法不同,是自动生成本地副本。

为避免更改传入的原始point,您可以在someFunc内创建一个局部变量。

这样的事情:

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

此外,最好不使用point 两者引用您的班级和参数。

答案 1 :(得分:2)

调用someFunc()使用by-reference语义,这样它修改的对象就是你调用它的对象。看起来你正在期待按值语义,其中函数获取它传递的对象的副本。