如果我有一个整数列表
x=[0, 0, 119, 101, 108, 108, 99, 111, 109]
我想从左边剪切2个元素
x=[119, 101, 108, 108, 99, 111, 109]
我该怎么办?
答案 0 :(得分:6)
>>> x = [0, 0, 119, 101, 108, 108, 99, 111, 109]
>>> x = x[2:]
>>> x
[119, 101, 108, 108, 99, 111, 109]
这会将第三项中的每个元素都添加到列表的末尾,我们只需将x
的值设为该值。
答案 1 :(得分:0)
Nein nein nein
很抱歉,我不认为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