0
#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変数の割り当てがないことがわかります が、変数somePointはifステートメントの後に魔法のように変化します

このプログラムの出力は次のようになります

ONE: point(-1, -1)

しかし、それは

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

誰かがsomePointが後に変わる理由を私に説明できますか

if somePoint == someFunc(somePoint):

調子?

私の英語が悪いならごめんなさい

4

2 に答える 2

4

pointifステートメントでinside関数を呼び出すときに値を変更するsomeFuncので、最後の値は(0,0)になると思います。その理由は、関数への参照(または「オブジェクト共有の受け渡し」)を渡しており、関数への変更は後で反映されるためです。これは、ローカルコピーが自動的に生成される値渡し方式とは異なります。

渡される元の変数を変更しないようにするには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

于 2012-05-25T16:22:17.473 に答える
2

呼び出しsomeFunc()は参照によるセマンティクスを使用するため、変更するオブジェクトは、呼び出し元のオブジェクトとまったく同じです。関数が渡されたオブジェクトのコピーを取得する値によるセマンティクスを期待していたようです。

于 2012-05-25T16:32:12.270 に答える