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_move,但似乎group在我进行任何递归调用之前就受到了影响。以上与此有何不同:

>>> 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指向的同一个对象上创建一个名为 point的变量group

如果您想创建一个实际的副本,您可能需要查看copy.deepcopy().

于 2012-03-16T07:59:00.153 回答
2

当你这样做

# Make a copy to test values
new = group

您正在复制对象引用

此外,您的测试不是“智能”测试,因为在您的示例中,您使用的是原始类型变量而不是object

作为一般规则,请记住

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导致它们都引用表示整数的对象1x = 7导致x停止引用该1对象并开始引用另一个表示整数的对象7。同样对于y = 77. 独立性不是因为任何复制(因为没有任何复制),而是因为代码中没有任何内容指定对引用对象的更改(实际上这对于intPython 中的 s 是不可能的)。当人们期望这段代码最后的 x 等于 77 时,他们实际上是在不一致地解释事物,在某些行上期望值语义而在其他行上期望引用语义。值语义和引用语义都预测实际结果.

于 2012-03-16T09:20:31.353 回答