arr [index]和调用变量等于arr [index]之间的区别

时间:2018-04-26 16:15:06

标签: python arrays pointers reference

这个问题是关于python是否将其“名称”视为指针或引用,我还没有找到明确的解释。

考虑以下情况:

L = [[][]]
L1 = L[1]
L1 = [1] # Interested in what happens after this line
print L # L = [[], []]

然而, 如果我们将上述感兴趣的行改为L [1] = [1],即下面的代码块:

L = [[][]]
L1 = L[1]
L[1] = [1] # Interested in what happens after this line
print L # L = [[], [1]]

以上代码块仅因第三行而不同,我们使用L [1](直接索引数组)或L1(我们指定为L1 = L [1]的变量)。

那么L1和L [1]本质上是什么?有什么不同?其中一个是参考,另一个不是吗?

感谢您解决这个困惑!

2 个答案:

答案 0 :(得分:2)

L1 = bb存储在变量L1中。因此L1 = L[1]L1 = [1]只会更改L1指向的内容。第二项任务并不关心L1之前的内容。

L[a] = b基本上等同于L.__setitem__(a, b)。因此,虽然它看起来类似于变量赋值,但它是一种完全不同的东西。没有名称/变量/指针/引用L[1]

此外,在您的第二个代码块中,L1 = L[1]没有任何效果。你可以删除它,结果将是相同的。

答案 1 :(得分:1)

Python分配不会创建原始对象的副本,而是在两者之间创建绑定。考虑一下你原来的例子:

 >> L = [[],[]]
 >> L1 = L[1]
 >> L1.append(1)
 >> L[1].append(2)
 L1: [1, 2]
 L: [[], [1, 2]]

在您的原始示例中,您通过对新列表执行新分配来覆盖副本。 希望这有帮助!