代码之家  ›  专栏  ›  技术社区  ›  tpoker

arr[索引]和调用等于arr[索引]的变量之间的差异

  •  0
  • tpoker  · 技术社区  · 6 年前

    这个问题涉及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 回复  |  直到 6 年前
        1
  •  2
  •   Alex Hall    6 年前

    L1 = b 商店 b 在变量中 L1 所以 L1 = L[1] L1 = [1] 只要改变什么 L1级 指向。第二个任务不在乎里面有什么 L1级 之前

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

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

        2
  •  1
  •   rneeja    6 年前

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

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

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