2012-08-09 8 views
3
my_list = [1, 2] 

def f(): 
    print my_list 
    yield 11 
    print my_list 
    yield 22 
    print my_list 

my_list[:] = f() 

print "finally ", 
print my_list 

출력을 나열하려면 다음 내가 기대했던파이썬 슬라이스 할당

[1, 2] 
[1, 2] 
[1, 2] 
finally [11, 22] 

했다 :

[1, 2] 
[11, 2] 
[11, 22] 
finally [11, 22] 

누군가가 한 번 나에게 할당 위치에 슬라이스 말했다. 당연히 아니. 달성하기위한 우아한 방법이 있습니까?

+1

@BrenBarn "slice"에서 "splice"로 편집해야합니다. –

+1

예 (또는 오히려 "스플 라이스"에서 "슬라이스"로). 예 : http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange – BrenBarn

답변

6

슬라이스 할당이 제자리에 있지만 전체 생성기가 소비 될 때까지 할당이 수행되지 않습니다. 한 번에 하나의 요소를 목록에 할당하지 않습니다. 그것들을 모두 읽은 다음 한꺼번에 모두 목록에 붙입니다.

(시퀀스가 원래 슬라이스와 다른 길이 임에도 불구하고 시퀀스에 슬라이스를 지정할 수 있으므로이 방법을 사용해야합니다 (예 : x[2:3] = [1, 2, 3, 4, 5, 6]). 할 방법이 없습니다. 하나의 요소를 한 번에 하나씩 대체함으로써 이전의 슬라이스와 새로운 시퀀스를 대체 할 수 있습니다.

슬라이스 할당으로 원하는 결과를 얻을 수있는 방법이 없습니다. 슬라이스 할당은 항상 한꺼번에이 방식으로 작동합니다. 목록과 생성기를 병렬로 반복하고 개별 요소를 한 번에 하나씩 대체해야합니다.

+0

오른쪽의 문서를 참조하십시오. 그 자리에 my_list에 목록을 넣는 감각이 있지만 임시 목록으로 생성기를 소비하면 "적절한"목적을 달성 할 수 없습니다. 감사합니다. –

1

가능하지만이를 직접 수행 할 수는 없습니다.

이 고려 :

my_list = [1,2,3,4] 

def f(): 
    print 'first: ', my_list 
    yield 11 
    print 'second:', my_list 
    yield 22 
    print 'third: ', my_list   

def inplace(l, func): 
    gen=func() 
    for i,x in enumerate(l): 
     try: 
      l[i]=gen.next() 
     except StopIteration: 
      if i<len(l): 
       del l[i:] 
      break  

inplace(my_list,f) 

print  "final: ", my_list 

인쇄 : 물론

first: [1, 2, 3, 4] 
second: [11, 2, 3, 4] 
third: [11, 22, 3, 4] 
final: [11, 22] 

, 기록 된 방법을 목록은 원래 목록 또는 발전기의 요소의 짧아집니다.