4

我将“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”。
请帮忙。谢谢。

4

3 回答 3

6

您不是在创建列表的副本;您只需创建对它的第二个引用。

如果您想创建一个临时(浅)副本,请明确执行:

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仍指旧名单。

于 2013-06-08T00:35:44.193 回答
3

tempList并且haystack只是您绑定到相同的两个名称list。制作副本:

tempList = list(haystack) # shallow copy
于 2013-06-08T00:35:27.550 回答
1

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

于 2013-06-08T00:35:40.677 回答