【问题标题】:Reference Assignment in Python - Why isn't the value changed?Python 中的引用赋值 - 为什么值没有改变?
【发布时间】:2019-10-08 22:34:54
【问题描述】:

我知道python中的“变量赋值”实际上是将名称(变量)绑定/重新绑定到对象。

b = [1,2,3]
a = b[2] # binding a to b[2] ?
a = 1000

b 是[1, 2, 3]

这个变化之后,为什么b没有变化?

这是另一个例子:

b = [1,2,3]
a = b
a[0] = 1000

这个案例b是[1000, 2, 3]

在 Python 引用绑定中不是赋值吗?

谢谢

【问题讨论】:

  • 1,2,3 是 constance 不能更改值,但列出它的一个对象,然后当您将 b 分配给 a b 时,您正在创建对 b 的引用,称为 a 换句话说与指向的指针相同,如果您对一个引用“内存”进行突变,则 a 与 b 相同

标签: python


【解决方案1】:
a = b[2] # binding a to b[2] ?

具体来说,这会将 name a 绑定到 b[2] 引用的相同 value。它不会将a 绑定到列表b 中索引2 处的元素。 a 这个名字完全独立于它的值所在的列表。

a = 1000

现在您将名称 a 绑定到一个新值,即整数 1000。由于ab 没有关联,所以b 不会改变。

在你的第二个例子中:

a = b

现在a 绑定到b 绑定到的相同列表值。所以当你这样做时

a[0] = 1000

您修改了基础列表中具有两个不同名称的元素。当您通过任一名称访问列表时,您将看到相同的值。

【讨论】:

    【解决方案2】:

    a[0] = ... 是一种特殊形式的赋值,用于对方法调用进行去糖,

    a.__setattr__(0, ...)
    

    您没有重新分配名称a;您正在分配给由 a(和 b)引用的对象中的“插槽”。

    【讨论】:

      【解决方案3】:

      列表是可变对象,整数不是。在python中4不能变成5,但是列表可以改变它的内容。

      【讨论】:

        猜你喜欢
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        相关资源
        最近更新 更多