据说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中的列表真的可变吗?
答案 0 :(得分:3)
+
运算符不是mutator,它返回一个包含输入列表串联的新列表。
另一方面,+=
运算符是一个mutator。所以如果你这样做:
l1 += [30]
您会看到l1
和l2
都引用了更新后的列表。
这是Python中x = x + y
和x += 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开头的内容现在引用了一个新对象。