列表是否可变?

时间:2014-06-13 12:09:31

标签: python list mutable

据说python中的列表是可变的。 当我编写如下代码时,

l1=[6,7,8,4,3,10,22,4]
l2=l1
l1.append(30)
print(l1)
print(l2)

l1和l2都打印相同的列表:[6, 7, 8, 4, 3, 10, 22, 4, 30]

但是当我给出如下代码时,

l1=[6,7,8,4,3,10,22,4]
l2=l1
l1=l1+[30]
print(l1)
print(l2)

l1打印 - > [6, 7, 8, 4, 3, 10, 22, 4, 30]
l2打印 - > [6, 7, 8, 4, 3, 10, 22, 4]

所以,现在引用已经改变了。那么python中的列表真的可变吗?

6 个答案:

答案 0 :(得分:3)

+运算符不是mutator,它返回一个包含输入列表串联的新列表。

另一方面,+=运算符是一个mutator。所以如果你这样做:

l1 += [30]

您会看到l1l2都引用了更新后的列表。

这是Python中x = x + yx += y之间的细微差别。

答案 1 :(得分:3)

Python中的列表是可变的。引用更改的原因是+运算符确实创建了一个包含其操作数值的新列表。另一方面,+=运算符就地添加:

>>> l1 = [1,2,3]
>>> l2 = l1
>>> l1 += [30]
>>> l2
[1,2,3,30]

答案 2 :(得分:1)

是。 l1+[30]创建一个新列表,它是两个列表的串联。这就是+在列表上工作的方式。

答案 3 :(得分:1)

是的,它们是可变的。

在第二个示例中,您使用新列表覆盖l1的值,而不是修改它引用的对象。

要修改原始列表,您可以使用+=运算符:

l1 += [30]

答案 4 :(得分:1)

列表在python中是可变的,但添加两个列表将创建一个新对象。您可以通过检查id来验证两个对象是否相同。例如:

In [1]: list1 = [1, 2]
In [2]: list2 = [3]

In [3]: id(list1)
Out[3]: 4359455952

In [4]: id(list2)
Out[4]: 4358798728

# Creates a new list
In [5]: list1 = list1 + [42]

In [6]: list1
Out[6]: [1, 2, 42]

# The id of the list1 is different
In [7]: id(list1)
Out[7]: 4359456024

# Mutate the list1 by appending an integer
In [8]: list1.append(53)

# The object is the same.
In [9]: id(list1)
Out[9]: 4359456024

此致

答案 5 :(得分:1)

当您声明L2时,您声明对对象(列表)的引用,当您重新声明L1时,您正在创建新列表并更改L1引用的内容。所以最后L2引用以L1和L1开头的内容现在引用了一个新对象。