0
def group_move(group, damper):
    # Make a copy to test values
    new = group

    # See what the original group value is
    print("Test = " + str(group.ctris[0].p1.x))
    dr = some float
    dx = some float
    dy = some float
    # Make changes to new
    moveGroup(new, dr, dx, dy)
    # See if those changes produce allowed values
    if (off_board_check(new) == 1):
        damper += 2.0
        # Reset to original to try again
        print("Test Here = " + str(group.ctris[0].p1.x))
        group_move(group, damper)
    else:
        # If everything is on the board, then make the change
        group = new

これを実行すると、最初の再帰で、Test印刷行が印刷行とは異なる値を生成することがわかりTest Hereます。なんで?このコードは の値にどのような影響を与える可能性がありgroupますか? テスト値が失敗した場合に備えて、変更groupされていないものを次の再帰レベルに渡そうとしていますが、再帰呼び出しを行う前に何らかの影響を受けているようです。上記はこれとどう違うのですか:group_movegroup

>>> x = 1
>>> y = x
>>> x = 7
>>> y = 77
>>> x
7
>>> y
77
4

3 に答える 3

6
# Make a copy to test values
new = group

コメントが正しくありません。それはコピーを作成しません。new指している同じオブジェクトを指し示すという名前の変数を作成するだけですgroup

実際のコピーを作成する場合は、 を参照してくださいcopy.deepcopy()

于 2012-03-16T07:59:00.153 に答える
2

あなたがするとき

# Make a copy to test values
new = group

オブジェクトの参照をコピーしています

さらに、あなたの例では、オブジェクトではなくプリミティブ型の変数を使用しているため、テストは「スマート」なものではありません。

原則として、それを覚えておいてください

Pythonの代入ステートメントはオブジェクトをコピーせず、ターゲットとオブジェクトの間にバインディングを作成します。可変または可変アイテムを含むコレクションの場合、一方が他方を変更せずに一方のコピーを変更できるように、コピーが必要になることがあります。このモジュールは、一般的な浅いコピー操作と深いコピー操作を提供します(以下で説明します)。

ここから

于 2012-03-16T08:06:34.590 に答える
0
new = group

これは、「newは、式を評価した結果の名前になるgroup(つまり、group式は単なる名前であるため、 によって現在名前が付けられているもの)」ことを意味します。これはコピーではなくエイリアスです。

x = 1
y = x
x = 7
y = 77

ここでも同じです。x = 1; y = x両方が整数を表すオブジェクトを参照するようにします1。オブジェクトへの参照を停止し、整数を表す別のオブジェクトへの参照を開始しx = 7ます。についても同様です。独立性は、コピーによるものではなく (存在しなかったため)、参照先オブジェクトへの変更を指定するコードが何もないためです (実際、Python の s では不可能です)。人々がこのコードの最後に x が 77 に等しいと期待する場合、実際には解釈に一貫性がなく、一部の行では値セマンティクスを期待し、他の行では参照セマンティクスを期待しています。値セマンティクスと参照セマンティクスの両方が実際の結果を予測しますx17y = 77int.

于 2012-03-16T09:20:31.353 に答える