나도 그냥 궁금해서 테스트해봄

def generate_numbers(size):

for i in range(size):

print("Generating number:"+str(i))

yield i


gen = generate_numbers(5)

print str(id(gen)) +" : gen"

print str(id(tuple(gen)))+" : id(tuple(gen))"


1616900885312 : gen

Generating number:0

Generating number:1

Generating number:2

Generating number:3

Generating number:4

1616899727208 : id(tuple(gen))


실행결과임


이 결과에서 도출가능한 지식은 무엇이냐


gen은 그냥 하나의 오브젝트같은거지

출력결과를 보면 알수있다.

즉 gen은 자바의 이터레이터같은거다

그럼 tuple(gen)은 머냐면 tuple을 생성해서 담아주기전에

메모리상에 저장된 gen의 forEach결과를 tuple에 담아서 만들어준다.

이거다.

결론은 next를 5번해주고있다는거다

그 next한 결과가 하나씩 반환되면서 메모리에 일시적으로 저장되고 그 저장되어있는게 한번에 tuple로 담겨서 생성된다.

tuple이 5번 생성되는 것은아니다.


절차적으로 실행되고있기때문에 쓰레드는 하나임


그럼 리스트의 컴프리헨션과 append와 머가 다른가

리스트 object는 이미 메모리상에 존재하고 그곳에 append 해주는거지

결과적으로 반복문이 돌때마다

[0]

[0 1]

[0 1 2]

식으로 메모리상에 새로 쓰여진다


그렇다고 제네레이터방식으로 넣을때 

리스트나 튜플에 넣는것의 차이는 1도없음

tuple(gen)이나 list(gen)이나 결과적으로 똑같음

뮤터블이냐 이무터블이냐 그 차이일뿐

저 위에서는 리스트와 튜플로 메모리상의 이점을 얻을수 있는게 1도없다는 말이다