Aliasing
어제의 징징댐이 무색하게 문제의 원인을 찾았다. 바로 Aliasing. 그게 무엇인지... 내가 설명을 그래도 조금은 해보겠다.
예전 노래 중에 그런 가사가 있었다. "이름은 하나지만 별명은 여러 개". Aliasing은 이것과 같다. 나의 사짜 프로그래밍 지식으로 이야기해 보자면 메모리에 올라간 객체는 하나지만 이를 가리키는 용어는 여러 개라는 것이다. 가령 다음과 같은 예제를 볼 수 있다
a = [1,3,5,7,9]
b = a
b.append(11)
print(a)
print(b)
위 예제의 출력값은 무엇일까. 정답은
[1,3,5,7,9,11]
[1,3,5,7,9,11]
와 같이 나올 것이다. 그 이유는 메모리 공간 안에 있는 하나의 객체를 두 가의 변수가 같은 곳을 가리키고 있기 때문이다. 이러한 현상을 aliasing이라고 한다. aliasing은 mutable 한 데이터 구조에서 적용 가능하다. python에서는 list, dictionary가 대표적이다. 이런 특성을 잘 이용하면 좀 더 간결한 코드를 작성할 수 있다.
Revit안에서도 몇몇 경우 aliasing이 존재하는 것을 확인했다. 내 경우에는 curveloop라는 객체로 인해 이런 현상이 발생했고, 그래서 원치 않는 결과를 가져오게 되었다. C#을 깔짝 공부했을 때 ref라는 키워드를 이용해 aliasing을 유도하는 방법이 있었는데, 아마 curveloop는 그런 특성을 가지고 있던 듯하다.
그럼 누군가는 해결책을 원할테니 간략히 적어보면 아래와 같다. 참고로 나는 pyrevit을 사용하기 때문에 해당 방식 중심으로 써본다
from Autodesk.Revit import DB
new_curve_loop = DB.CreateViaCopy(your_old_curve_loop)
이렇게 하면 새로운 객체를 메모리에 올려 aliasing을 피할 수 있다.