如果我有一个整数列表
x=[0, 0, 119, 101, 108, 108, 99, 111, 109]
我想从左边剪掉 2 个元素
x=[119, 101, 108, 108, 99, 111, 109]
我该怎么办 ?
使用Python 的切片符号:
>>> x = [0, 0, 119, 101, 108, 108, 99, 111, 109]
>>> x = x[2:]
>>> x
[119, 101, 108, 108, 99, 111, 109]
这将获取从第三个项目到列表末尾的每个元素,我们只需x
设置它的值。
不不不不不不不不不不不不不不不不不不不不
抱歉,我认为 Haidro 的解决方案不好,因为执行了不必要的重新分配。
看:
x = [0, 0, 119, 101, 108, 108, 99, 111, 109]
print id(x)
x = x[2:]
print id(x)
print
y = [0, 0, 119, 101, 108, 108, 99, 111, 109, 1003]
print id(y)
y[:2] = []
print id(y)
结果
18713576
18739528
18711736
18711736
x = x[2:]
显示导致问题的示例:
x = [0, 0, 119, 101, 108, 108, 99, 111, 109, 1003]
print id(x),x
gen = ((i,a+100) for i,a in enumerate(x))
for u in xrange(4):
print '%d %d' % gen.next()
x = x[2:]
print 'x = x[2:]\n',id(x),x
for u in xrange(4):
print '%d %d' % gen.next()
print '--------------------------'
y = [0, 0, 119, 101, 108, 108, 99, 111, 109, 1003]
print id(y),y
gen = ((i,b+100) for i,b in enumerate(y))
for u in xrange(4):
print '%d %d' % gen.next()
y[:2] = []
print 'y[:2] = []\n',id(y),y
for u in xrange(4):
print '%d %d' % gen.next()
结果
18713576 [0, 0, 119, 101, 108, 108, 99, 111, 109, 1003]
0 100
1 100
2 219
3 201
x = x[2:]
18711736 [119, 101, 108, 108, 99, 111, 109, 1003]
4 208
5 208
6 199
7 211
--------------------------
18740128 [0, 0, 119, 101, 108, 108, 99, 111, 109, 1003]
0 100
1 100
2 219
3 201
y[:2] = []
18740128 [119, 101, 108, 108, 99, 111, 109, 1003]
4 199
5 211
6 209
7 1103
在第一种情况下( x = x[2:] ),x
被重新分配给另一个对象。但是在重新分配之前创建的生成器仍然使用相同的列表对象来生成元素。这可能是某些代码中的问题。
但确实,其他代码在其他情况下也可能是一个问题。
我的意思是,我们x = x[2:]
绝对不会受到保护而不会引发问题。
z[:] = z[2:]
明显不同于y[:2] = []
:
import dis
print 'y[:2] = []'
def f(z):
y[:2] = []
dis.dis(f)
print '====================='
print 'z[:] = z[2:]'
def f(z):
z[:] = z[2:]
dis.dis(f)
结果
y[:2] = []
7 0 BUILD_LIST 0
3 LOAD_GLOBAL 0 (y)
6 LOAD_CONST 1 (2)
9 STORE_SLICE+2
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
=====================
z[:] = z[2:]
12 0 LOAD_FAST 0 (z)
3 LOAD_CONST 1 (2)
6 SLICE+1
7 LOAD_FAST 0 (z)
10 STORE_SLICE+0
11 LOAD_CONST 0 (None)
14 RETURN_VALUE