我通常了解切片在赋值运算符左右的行为。
但是,我已经在Python(3.8.0)手册中看到了这一点,并试图找出我所缺少的东西。
通过将所有元素替换为空列表来清除列表
字母[:] = []
与just有letters = []
什么不同?
([:]
由于stackoverflow认为您正在寻找标签,因此搜索并不容易。因此,如果已经有答案,我将找不到它。)
我看到一些不相关的答案。因此,希望明确起见,问题不在于[:]
切片的含义,而在于将空列表分配给一个。
分配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)
这段代码演示了正在发生的事情:
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[:] = []
从两个变量再次引用同一列表开始,但随后列表本身被修改(使用[:]
),并且两个变量仍引用同一列表,但现在已修改列表。
var = []
是对该名称的赋值var
。它替换了var
曾经用引用的内容[]
。
var[:] = []
是变相的方法调用:var.__setitem__(slice(), [])
。它用中的元素替换了切片所指的元素(在本例中为所有元素)[]
,有效地清空了列表,而没有完全替换它。
顺便说一句,您可以var.clear()
用来完成相同的事情。切片分配通常可以让您将一个值范围替换为另一个值范围(可能更长或更短)。
归档时间: |
|
查看次数: |
271 次 |
最近记录: |