【问题标题】:Difference between arr[index] and calling the variable equal to arr[index]arr[index] 和调用等于 arr[index] 的变量之间的区别
【发布时间】:2018-04-26 16:15:05
【问题描述】:

这个问题是关于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] 本质上是什么?有什么不同?其中一个是参考,另一个不是?

感谢您解决这个困惑!

【问题讨论】:

标签: python arrays pointers reference


【解决方案1】:

L1 = bb 存储在变量L1 中。所以L1 = L[1]L1 = [1] 只需更改L1 指向的内容。第二个任务不关心之​​前L1 中的内容。

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

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

【讨论】:

    【解决方案2】:

    Python 赋值不会创建原始对象的副本,而是在两者之间创建绑定。考虑您的原始示例:

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      相关资源
      最近更新 更多