var [:] = []与var = []有何不同?

ton*_*mtr 9 python python-3.x

我通常了解切片在赋值运算符左右的行为。

但是,我已经在Python(3.8.0)手册中看到了这一点,并试图找出我所缺少的东西。

通过将所有元素替换为空列表来清除列表

字母[:] = []

与just有letters = []什么不同?

[:]由于stackoverflow认为您正在寻找标签,因此搜索并不容易。因此,如果已经有答案,我将找不到它。)

我看到一些不相关的答案。因此,希望明确起见,问题不在于[:]切片的含义,而在于将列表分配给一个。

ber*_*eal 7

分配var = [] 名称绑定var到新创建的列表。该名称var以前可能已绑定或未绑定到任何其他列表,如果已绑定,则该列表将保持不变。

另一方面,var[:] = []期望var已经绑定到列表,并且该列表就地更改。

这就是为什么这两种情况下的行为不同:

var1 = [1, 2, 3]
var2 = var1
var1 = []
print(var1, var2)  # prints [] [1, 2, 3]

var1 = [1, 2, 3]
var2 = var1
var1[:] = []
print(var1, var2)  # prints [] []
Run Code Online (Sandbox Code Playgroud)


qua*_*ana 6

这段代码演示了正在发生的事情:

original = ['a','b','c']

letters = original

print('Same List')
print(original)
print(letters)

letters = []

print('Different lists')
print(original)
print(letters)

letters = original

letters[:] = []

print('Same list, but empty')
print(original)
print(letters)
Run Code Online (Sandbox Code Playgroud)

输出:

Same List
['a', 'b', 'c']
['a', 'b', 'c']
Different lists
['a', 'b', 'c']
[]
Same list, but empty
[]
[]
Run Code Online (Sandbox Code Playgroud)

代码的第一部分:letters = original表示两个变量都引用相同的列表。

第二部分:letters = []显示两个变量现在引用不同的列表。

第三部分:letters = original; letters[:] = []从两个变量再次引用同一列表开始,但随后列表本身被修改(使用[:]),并且两个变量仍引用同一列表,但现在已修改列表。


che*_*ner 5

var = []是对该名称的赋值var。它替换了var曾经用引用的内容[]

var[:] = []是变相的方法调用:var.__setitem__(slice(), [])。它用中的元素替换了切片所指的元素(在本例中为所有元素)[],有效地清空了列表,而没有完全替换它。

顺便说一句,您可以var.clear()用来完成相同的事情。切片分配通常可以让您将一个值范围替换为另一个值范围(可能更长或更短)。