【问题标题】:what happen b=a[:] in python?在 python 中 b=a[:] 会发生什么?
【发布时间】:2012-11-24 07:24:36
【问题描述】:
    >>>a=[999999,2,3]
    >>>b=[999999,2,3]
    >>>print(a[0] is b[0])
    False#because it works for numbers -5 through 256
    >>>a=[1,2,3]
    >>>b=a[:]
    >>>print(a[0] is b[0])
    True#because it works for numbers -5 through 256
    >>>a=[999999,2,3]
    >>>b=a[:]
    >>>print(a[0] is b[0])
    True#why not False ???

发生了什么 b=a[:] (为什么不适用于数字 -5 到 256 )?

【问题讨论】:

  • 我认为你混淆了两件奇怪的事情:1) b=a[:] 复制对所有整数的引用,所以 b[0] 指向与 a[0] 相同的 int 并且 a[0] is b[0] 返回 @ 987654326@。 2) 始终保留对数字 -5 到 256 的引用。

标签: python python-3.x python-2.7


【解决方案1】:

-5 到 256 的范围与 following 有关:

当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建 int 时,实际上您只是返回对现有对象的引用。

为了证明这一点,请注意 id(123) 如何始终返回相同的值,而 id(9999) 可以返回不同的值:

In [18]: id(123)
Out[18]: 9421736

In [19]: id(123)
Out[19]: 9421736

In [20]: id(9999)
Out[20]: 9708228

In [21]: id(9999)
Out[21]: 10706060

这当然是当前实现的产物。不同的 Python 实现可能不会这样做,或者可能使用不同的范围。

关于你的最后一个例子:

In [14]: a=[999999, 2, 3]

In [15]: b=a[:]

In [16]: map(id, a)
Out[16]: [10908252, 9421180, 9421168]

In [17]: map(id, b)
Out[17]: [10908252, 9421180, 9421168]

如您所见,[:] 只是复制引用。这解释了为什么 a[i] is b[i] 对于所有 i 的计算结果为 True

【讨论】:

  • 这可能的原因是整数是不可变的。
  • 对于您的 id(9999) 示例,它变得更加混乱:尝试在常规 Python 2.x 提示符而不是 IPython 中进行尝试,您将看到每次返回相同的值(因为每次都重复使用相同的整数槽;当然,IPython 中历史记录的存在使得这不可能)。
【解决方案2】:
a = [1,2,3]
b = a

这里,b=a 使 b 成为 a 的别名。这意味着,对 b 的所有更改都将在 a 中看到。

b=a[:] 表示复制a并将其分配给b。

【讨论】:

    【解决方案3】:
     >>>b=a[:]
    

    对列表 a 中的项目和复制 b 的名称进行浅拷贝。新列表中包含的所有项目都将具有与原始列表中的项目相同的对象 ID(思考指针)。这是预期的行为。

    【讨论】:

      【解决方案4】:

      添加到@NPE's answer,这是一个很好的插图:

      a = range(-7, 259)
      b = range(-7, 259)
      for x, y in zip(a,b): 
          print x, x is y
      

      打印:

      -7 False
      -6 False
      -5 True
      -4 True
      ...
      255 True
      256 True
      257 False
      258 False
      

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-23
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        相关资源
        最近更新 更多