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
?当在赋值运算符的左侧使用时,它们不会创建副本。他们是为了改变现有的名单。