这个问题是关于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]本质上是什么?有什么不同?其中一个是参考,另一个不是吗?
感谢您解决这个困惑!
答案 0 :(得分:2)
L1 = b
将b
存储在变量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]]
在您的原始示例中,您通过对新列表执行新分配来覆盖副本。 希望这有帮助!