• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

shuffle함수 질문

23.01.10 00:53 작성 조회수 216

1

처음 shuffle 함수를 사용할 때, C언어에서 하던 습관 그대로 mylist = shuffle(mylist)와 같이 작성했더니 typeError를 뱉더군요.

shuffle(mylist)와 같이 쓰면 제가 원하는대로, 변환된 값이 그대로 원래 리스트에 저장되더라구요. 아무래도 shuffle함수가 포인터로 직접 메모리를 건드리는 함수인 것 같은데,

 

궁금한 점은 "그럼 원래 코드는 뭐가 문제냐"입니다.

shuffle 함수는 반환값이 없어서 저렇게 자기할당시키려고 하면 문제가 생기는 건가요?

mylist를 인자로 전달 -> shuffle처리 -> shuffle된 mylist 뱉기 -> 그걸 mylist에 저장

이 구조라면 문제가 생길 이유가 없는 것 같은데...

mylist를 인자로 전달 -> mylist가 메모리에서 직접 shuffle됨. 뱉는 값 없음 -> None이나 null이 mylist에 저장되려고 함(이래서 에러가 생김) 이런 식인 건가요?

답변 1

답변을 작성해보세요.

1

일코님의 프로필

일코

2023.02.26

마지막 줄에 하신 말씀이 맞습니다.

random.shuffle 함수는 연산 후 아무 것도 리턴하지 않습니다. ("뱉는 값 없음?"이라고 표현하셨는데, 정확합니다. random.shuffle 구현부에 return문이 없습니다. 파이썬에는 이렇게 리턴문이 없는 함수가 많습니다.)

아래는 random.shuffle 함수의 소스코드입니다.

    def shuffle(self, x):
        """Shuffle list x in place, and return None."""

        randbelow = self._randbelow
        for i in reversed(range(1, len(x))):
            # pick an element in x[:i+1] with which to exchange x[i]
            j = randbelow(i + 1)
            x[i], x[j] = x[j], x[i]

 

그래서, 함수가 무엇을 리턴하는지 숙지해둘 필요가 있습니다. 예를 들어 아래의 세 가지 코드는 전부 a가 None이 되어버립니다.

# 1: a가 None이 됨
>>> a = [1, 3, 2, 5, 4]
>>> a = a.sort()

# 2
>>> a = [1, 2, 3, 4, 5]
>>> a = a.reverse()

# 3
>>> a = [1, 2, 3, 4, 5]
>>> a = a.append(6)