#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。抱歉,如果我的英语不好
答案 0 :(得分:4)
调用它时,您可以更改函数point
内someFunc
的值
在你的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语义,这样它修改的对象就是你调用它的对象。看起来你正在期待按值语义,其中函数获取它传递的对象的副本。