Python 如何从整数列表中剪切元素

Python 如何从整数列表中剪切元素,python,list,integer,Python,List,Integer,如果我有一个整数列表 x=[0, 0, 119, 101, 108, 108, 99, 111, 109] 我想从左边剪下两个元素 x=[119, 101, 108, 108, 99, 111, 109] 我该怎么办?使用: 这将获取从第三项到列表末尾的每个元素,我们只需将其值设为x。Nein-Nein-Nein 对不起,我不认为海德罗的解决方案是好的,因为重新分配是不必要的 见: 结果 18713576 18739528 18711736 18711736 187135

如果我有一个整数列表

    x=[0, 0, 119, 101, 108, 108, 99, 111, 109]
我想从左边剪下两个元素

    x=[119, 101, 108, 108, 99, 111, 109]
我该怎么办?

使用:

这将获取从第三项到列表末尾的每个元素,我们只需将其值设为
x

Nein-Nein-Nein

对不起,我不认为海德罗的解决方案是好的,因为重新分配是不必要的

见:

结果

18713576
18739528

18711736
18711736
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
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  
编辑1 显示导致问题的
x=x[2:][/code>示例:

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
18739528

18711736
18711736
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
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  
在第一种情况下(x=x[2:]),
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)
结果

18713576
18739528

18711736
18711736
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
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  

我建议您在回答中简要描述一下现场作业:
x[:]=x[2://code>。否则您将创建一个副本,而IRL可能不可取。@kojiro在这种情况下会有影响吗?我不认为这有什么问题:3在这种情况下这无关紧要,但OP和未来的读者可能不知道。我只是建议对答案稍加改进。@kojiro我仍然不明白为什么这是个问题。它会出现在哪里?@Haidro如果你对列表有多个引用,并且你希望它们是相同的,它会出现。在
y[:2]=[]
行中,您很可能打算将
y[:]=y[2::][/code>放入。在目前的情况下,你的回答并没有回答原来的问题,因为这只是对海德罗回答的批评(因此应该在评论中)。@ShashankGupta我不知道你所说的“可能的意思”是什么意思。我看到的是,这两个指令的分解是不同的,请参见我的第二次编辑。顺便问一下,是你否决了我的答案吗?是的,我确实否决了你的答案,因为它甚至没有解决问题。你写这篇文章只是为了批评海德罗的回答,我觉得这有点傻。当我说“可能的意思”时,我指的是你似乎根本没有和OP说话,我觉得你应该把这个“答案”作为评论。@ShashankGupta我无法想象你怎么能说我没有回答这个问题。在问题中,OP说我想从左边剪下2个元素:这正是我的代码所做的。如果你先回答问题,比如:
x[:2]=[]
,然后解释为什么这种形式是最好的,我会投你的票。