Python 使用带受让人的切片表示法为列表赋值

Python 使用带受让人的切片表示法为列表赋值,python,list,slice,Python,List,Slice,我见过有人使用[:]制作列表的副本,如: >>> a = [1,2,3,4] >>> b = a[:] >>> a[0] = 5 >>> print a [5, 2, 3, 4] >>> print b [1, 2, 3, 4] 我明白。然而,我也看到pleople在分配给列表时使用了这种符号,如: >>> a = [1,2,3,4] >>> b = [4,5,6,7]

我见过有人使用
[:]
制作列表的副本,如:

>>> a = [1,2,3,4]
>>> b = a[:]
>>> a[0] = 5
>>> print a
[5, 2, 3, 4]
>>> print b
[1, 2, 3, 4]
我明白。然而,我也看到pleople在分配给列表时使用了这种符号,如:

>>> a = [1,2,3,4]
>>> b = [4,5,6,7]
>>> a[:] = b
>>> print a
[4, 5, 6, 7]
>>> print b
[4, 5, 6, 7]

但我真的不明白他们为什么在这里使用
[:]
。我不知道有什么不同吗?

更多的是关于它如何复制列表。例如:

>>> a = [1, 2, 3, 4]
>>> b = [4, 5, 6, 7]
>>> a = b
>>> b[0] = 9
>>> a
[9, 5, 6, 7]
>>> b
[9, 5, 6, 7]
此处,
a
现在引用
b
,因此更改
b
的值也会影响
a

>>> a = [1, 2, 3, 4]
>>> b = [4, 5, 6, 7]
>>> a[:] = b
>>> b[0] = 9
>>> a
[4, 5, 6, 7]
>>> b
[9, 5, 6, 7]

在使用切片的情况下,它只是列表元素的浅拷贝,因此
b
中的更改不会影响
a
。希望这有助于澄清问题。

是的,当您在左侧使用
[:]
时,它会更改(变异)列表,而不是为名称(变量)指定新列表。要查看这一点,请尝试以下代码-

a = [1,2,3,4]
b = a
a[:] = [5,4,3,2]
print(a)
print(b)
你会看到“a”和“b”都改变了

要查看上述分配和正常分配之间的差异,请尝试下面的代码-

a = [1,2,3,4]
b = a
a = [5,4,3,2]
print(a)
print(b)

您将看到只有“a”发生了变化,“b”仍然指向
[1,2,3,4]
a[:]=b
a=b
之间确实存在差异

>>> a = [1,2,3,4]
>>> b = [4,5,6,7]
>>> c = [8,9,0,1]
>>> c = b
>>> a[:] = b
>>> b[0] = 0
>>> a
[4, 5, 6, 7]
>>> c
[0, 5, 6, 7]
>>> 
当您编写
a=b
时,a是对与b相同的列表的引用:b中的任何更改都将影响a

编写
a[:]=b
a是一个用b元素初始化的列表:b中的更改不会影响a


而且
a[:]=b
a=b[:]
之间也存在差异

>>> a = [1,2,3,4]
>>> b = [4,5,6,7]
>>> c = a
>>> a = b[:]
>>> a
[4, 5, 6, 7]
>>> c
[1, 2, 3, 4]
>>> a = [1,2,3,4]
>>> b = [4,5,6,7]
>>> c = a
>>> a[:] = b
>>> a
[4, 5, 6, 7]
>>> c
[4, 5, 6, 7]
使用
a=b[:]
,如果指向a的另一个变量不受影响,则使用b中的元素创建一个新列表


使用
a[:]=b
,可以更改a的元素。如果另一个变量指向,它也会被更改。

在第二个示例中,它是一个浅拷贝,第一个示例创建了一个referenceFixed,感谢您的更正。我想您的意思是我不会看到这两个变量都被更改?由于
a[:]
是自身的一个吞咽副本,不再指向
b
?当在赋值运算符的左侧使用时,它们不会创建副本。他们是为了改变现有的名单。