콘텐츠로 이동

SET 16 — 서술형 모범답안


1. 출력 [1, 2] [1, 2] True

b=[]는 함수가 정의될 때 단 한 번만 생성되는 기본값입니다. x = f(1)이 이 기본 리스트에 1을 추가해 [1]을 만들고, y = f(2)는 같은 기본 리스트(이미 [1])에 2를 추가해 [1, 2]를 만듭니다. xy는 처음부터 같은 객체를 가리키므로 x is yTrue이고, 둘 다 최종 상태인 [1, 2]로 보입니다.

2. 출력 1 2 3 3

count는 클래스 변수이고 Counter.count += 1은 매 인스턴스 생성마다 이 클래스 변수를 직접 증가시킵니다. c1 생성 시 1, c2 생성 시 2, c3 생성 시 3이 되며, 각 self.id에는 그 시점의 값이 저장됩니다. 마지막에 Counter.count3입니다.

3. 출력 {'a': 100, 'b': 2} {'a': 100, 'b': 2} {'a': 1, 'b': 200}

d2 = d1은 같은 딕셔너리를 가리키는 또 다른 이름이므로 d2["a"] = 100d1에도 그대로 반영됩니다. 반면 d3 = d1.copy()는 그 시점까지의 내용을 복사한 독립적인 새 딕셔너리이므로, d3["b"] = 200d3에만 영향을 주고 d1, d2는 변하지 않습니다.

4. 출력 5 True

random.randint(1, 10)을 5번 호출해 만든 리스트이므로 길이는 항상 5이고, randint(1, 10)은 항상 1 이상 10 이하의 정수를 반환하므로 모든 값이 그 범위 안에 있어 all(...)은 항상 True입니다. 시드를 고정했지만 이 출력은 시드 값과 무관하게 항상 같습니다.

5.

def dedup(lst):
    seen = set()
    result = []
    for x in lst:
        if x not in seen:
            seen.add(x)
            result.append(x)
    return result

6.

def stats(nums):
    return min(nums), max(nums), sum(nums) / len(nums)

7.

def common(a, b):
    return sorted(set(a) & set(b))

8.

문제: __init__에서 items = []로 작성하면 이는 지역 변수일 뿐 self.items가 아닙니다. 따라서 인스턴스에는 items 속성이 전혀 생성되지 않고, push()에서 self.items.append(x)를 호출하는 순간 self.items가 존재하지 않아 AttributeError가 발생합니다.

고친 코드:

class Stack:
    def __init__(self):
        self.items = []
    def push(self, x):
        self.items.append(x)
    def pop(self):
        return self.items.pop()

s = Stack()
s.push(1)