【问题标题】:How to use a temporary variable in Python 2.7 - memory如何在 Python 2.7 中使用临时变量 - 内存
【发布时间】:2013-06-08 00:33:33
【问题描述】:

我将 'haystack' 保存在一个临时变量中,但是当我修改 'haystack' 时,临时变量也发生了变化。为什么?请帮忙?这是正常的?在 PHP 中我没有这个问题。

# -*- coding:utf-8 -*-

haystack = [1,'Two',3]   
tempList = haystack   
print 'TempList='    
print tempList   
iterable = 'hello'  
haystack.extend(iterable)   
print 'TempList='   
print tempList

在控制台返回

TempList=
[1, 'Two', 3]
TempList=
[1, 'Two', 3, 'h', 'e', 'l', 'l', 'o']

但我没有修改变量“tempList”。
请帮忙。谢谢。

【问题讨论】:

    标签: python variables memory


    【解决方案1】:

    您没有创建列表的副本;您只需创建对它的第二个引用。

    如果您想创建一个临时(浅)副本,请明确地这样做:

    tempList = list(haystack)
    

    或使用完整列表切片:

    tempList = haystack[:]
    

    您在对象上调用.extend() 时就地修改了可变列表,因此对该列表的所有引用都会看到更改。

    另一种方法是使用连接而不是扩展来创建一个新列表:

    haystack = [1,'Two',3]   
    tempList = haystack  # points to same list
    haystack = haystack + list(iterable)  # creates a *new* list object
    

    现在haystack 变量已重新绑定到一个新列表; tempList 仍然是旧列表。

    【讨论】:

    • 很好的解释。另一种方法是不使用变异方法——而不是 haystack.extend(iterable) 使用 haystack = haystack + list(iterable)(或者 haystack = itertools.chain(haystack, iterable),如果您不需要列表)。
    【解决方案2】:

    tempListhaystack 只是您绑定到同一个 list 的两个名称。 复制一份:

    tempList = list(haystack) # shallow copy
    

    【讨论】:

      【解决方案3】:

      这是 Python 中列表和独立变量之间行为差异的经典示例。这是因为tempList = haystack 不会复制 haystack 值到tempList,而是将haystack 的地址分配给tempList 的地址。也就是说,现在你用两个名字来指代内存中的同一个地方。所以修改一个会修改另一个。要复制值,您可以执行tempList = list(haystack)

      【讨论】:

        猜你喜欢
        • 2016-06-11
        • 2019-09-26
        • 2018-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多