这些线之间有什么区别?
>>> my_list = []
>>> my_list[:] = []
>>> my_list[:][:] = []
>>> my_list[:][:][:] = []
>>> my_list[:][:][:][:] = []
>>> my_list[:][:][:][:]... = []
答案 0 :(得分:2)
my_list = []
创建一个新的列表对象,并将名称my_list
绑定到该对象。如果在引用之前有任何事情被绑定到my_list
,那么
my_list[:] = []
要求my_list
已绑定到列表对象(或其他支持切片分配的类型);该列表对象中包含的所有索引都被右侧另一个列表对象中的索引替换。在这种情况下,两个列表都是空的,因此没有实际的更改,但如果my_list
有任何内容,则它们现在已被清除。
my_list[:][:] = []
首先从现有my_list
对象中选择一个切片,生成新列表对象,然后将第2步应用于该结果。然后再次丢弃新的列表对象。
其余的只是3的变体,选择被多次应用。
为了说明,请更改my_list
中包含的内容。第一步:
>>> my_list = [1, 2, 3]
>>> other_reference = my_list
>>> other_reference is my_list
True
>>> my_list = ['new', 'list']
>>> my_list is other_reference
False
>>> other_reference
[1, 2, 3]
my_list
名称已绑定到新的列表对象,仍由other_reference
引用的列表对象本身未更改。
步骤2更改列表对象本身:
>>> my_list = [1, 2, 3]
>>> other_reference = my_list
>>> my_list[:] = [4, 5]
>>> my_list is other_reference
True
>>> other_reference
[4, 5]
>>> my_list
[4, 5]
列表对象中的所有索引都被替换,对同一列表对象的其他引用会看到更改。
步骤3不做任何更改,因为副本改为:
>>> my_list = [1, 2, 3]
>>> other_reference = my_list
>>> my_list[:][:] = [4, 5]
>>> my_list is other_reference
True
>>> my_list
[1, 2, 3]
>>> my_list[:][:][:] = ["won't", 'matter']
>>> my_list
[1, 2, 3]