【问题标题】:Assignments just bind names to objects?分配只是将名称绑定到对象?
【发布时间】:2016-07-18 14:44:28
【问题描述】:

根据 Python 教程,9.2。 Python 范围和命名空间:

分配不复制数据——它们只是将名称绑定到对象。

所以我很惊讶下面的代码并没有让我感到惊讶:

>>> a = 42
>>> b = a
>>> b = b / 2
>>> a
42
>>> b
21

如果赋值 b = a 只是将名称 b 绑定到 int 对象 42,而 42 已经绑定到 a,那么 ab = b / 2 之后不应该是 21被执行,因为ab 指的是同一个对象?

【问题讨论】:

  • 不,你有 rebound 这个名字。整数是不可变的。阅读:nedbatchelder.com/text/names.html
  • 对象没有名字——名字有对象。
  • @erip 你的意思是一个对象可以有很多不同的名字,而一个名字只能指一个对象?
  • @sunqingyao 是的,没错。

标签: python python-2.7 reference namespaces


【解决方案1】:

好吧,你确实给b分配了另一个任务:

b = b / 2

并且由于对int(不可变)类型的操作将始终返回一个新对象,因此不会对原始值进行任何更改无论操作可能是什么。

这对于可以在某些操作中更改的可变类型有所不同,即增强赋值操作是在原地进行更改:

>>> a = [20]
>>> b = a
>>> b += [1]
>>> b
[20, 1]
>>> a 
[20, 1]

当然,请注意,简单的赋值不会发生这种情况,因为 ints 的名称是指一个新对象:

>>> b = b + [1]
>>> b
[20, 1, 1]
>>> a
[20, 1] 

【讨论】:

    【解决方案2】:

    在b =b/2之后,b为新对象

    >>> a = 42
    >>> id(a)
    8006428
    >>> b = a
    >>> id(b)
    8006428
    >>> b = b/2
    >>> id(b)
    8006680
    

    【讨论】:

      【解决方案3】:

      这是它的踪迹:

      >>> a = 42
      a = 42
      b 未定义

      >>> b = a
      a = 42
      b = 一个

      >>> b = b / 2
      a = 42
      b = 21

      操作b = b / 2 正在使用b 创建一个新对象,该对象当时指向a。它并没有改变a,只是通过涉及a 的操作创建一个新值。现在,b 不再指代a,而是使用a 创建的新值。

      【讨论】:

        猜你喜欢
        • 2017-11-01
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多