2

我最近一直在玩 Jython,我发现了一些奇怪的东西。我确定我在这里遗漏了一些明显的东西,但是有人可以向我解释为什么 .reverse() 不适用于多维数组的单行吗?

输入是使用 PythonInterpreter.set() 从 Java 传入的

当我执行以下 python 代码时...

#Integer[][] input
print(input[0])
input[0].reverse()
print(input[0])

我得到以下输出,其中的值没有被反转。

array(java.lang.Integer, [0, 1, 1, 1, 1])
array(java.lang.Integer, [0, 1, 1, 1, 1])

虽然如果我在一维数组上执行 reverse() ......

#Integer[] input;
print(input)
input.reverse()
print(input)

结果如我所料。

array(java.lang.Integer, [0, 1, 1, 1, 1])
array(java.lang.Integer, [1, 1, 1, 1, 0])

同样,如果我将 input[0] 复制到它自己的变量中,然后反转,它也可以按预期工作。

#Integer[][] input
print(input[0])
tmp = input[0]
tmp.reverse()
input[0] = tmp
print(input[0])

我也得到了我期望的结果。

array(java.lang.Integer, [0, 1, 1, 1, 1])
array(java.lang.Integer, [1, 1, 1, 1, 0])

我也得到了预期的结果......

#Integer[][] input
print(input[0])
input[0] = input[::-1]
print(input[0])

- -编辑 - -

在这些情况下, .insert() 似乎也无法采取行动......

#Integer[][] input
print(input[0])
input[0].insert(0,123)
print(input[0])

生产...

array(java.lang.Integer, [0, 1, 1, 1, 1])
array(java.lang.Integer, [0, 1, 1, 1, 1])

.append() 和 .pop() 也是如此。我觉得这适用于许多(如果不是全部)列表函数。

4

2 回答 2

2

访问input[0](以及任何其他索引)可能会创建一个包含数据副本的一维数组,而不是您所期望的数据视图。

于 2012-11-23T18:35:59.153 回答
0

我的猜测是,当您使用 Integer[][] 输入时,您会创建一个不可变数据的表(可变)。因此,虽然您可以修改列表,但不能修改该列表中包含的对象。因此,所有需要修改数组的方法(追加、弹出、反向)都不起作用。

于 2012-11-23T18:02:06.960 回答