【问题标题】:Unexpected deque python behaviour意外的双端队列python行为
【发布时间】:2015-02-02 19:56:40
【问题描述】:

为什么在下面的作业中..

d = deque('abc')
a = d
d.clear()
print a

双端队列([])

返回一个空的双端队列?尽管清除了旧的双端队列,但我希望将数据保留在 a 中。

【问题讨论】:

    标签: python collections deque


    【解决方案1】:
    >>> from copy import deepcopy
    >>> d = deque('abc')
    >>> a = deepcopy(d)
    >>> d.clear()
    >>> a
    deque(['a', 'b', 'c'])
    

    或者你可以使用deque's内置的复制功能。

    >>> d = deque('abc')
    >>> a = d.__copy__
    >>> a
    <built-in method __copy__ of collections.deque object at 0x02437C70>
    >>> a = d.__copy__()
    >>> a
    deque(['a', 'b', 'c'])
    >>> d.clear()
    >>> a
    deque(['a', 'b', 'c'])
    

    您引用的是同一个对象,这就是为什么在清除 d 之后甚至 a 也被清除了。为此,您需要使用 deepcopy 将 object d 复制到 a。哪个会为您复制对象而不是引用它

    >>> id(a)
    37976360
    >>> id(d)
    37976248
    

    【讨论】:

      【解决方案2】:

      ad 引用同一个对象。所以如果你clear它,它将被清除为“两个变量”。

      您可以通过打印对象的身份来检查。

      >>> id(a)
      44988624L
      >>> id(d)
      44988624L
      

      通过赋值复制值仅适用于int 等基本数据类型。 如果您处理对象,则必须复制它,因为变量本身只是持有对该对象的引用。

      你可以这样做

      d = deque('abc')
      a = deque('abc')
      

      或与

      >>> import copy
      >>> d = copy.copy(a)
      

      导致

      >>> id(a)
      44988624L
      >>> id(d)
      44989352L
      

      但是你会在ad 中得到两个不同的对象,使用后会有所不同。

      【讨论】:

        【解决方案3】:

        行:

        a = d
        

        不创建副本 - 它只是为同一对象创建另一个名称。

        要创建副本,请执行以下操作:

        d = deque('abc')
        a = deque(d)
        

        【讨论】: