셀과 변수 _ 전역 네임스페이스 규칙
marimo에서 변수는 어떻게 공유될까요. 셀 A에서 정의한 변수를 셀 B에서 쓸 수 있는지, 쓸 수 있다면 어떤 규칙을 따르는지를 먼저 이해해야 합니다. marimo는 모든 셀이 하나의 전역 네임스페이스를 공유하는 방식으로 동작합니다.
전역 네임스페이스 공유
Jupyter에서 셀을 실행하면 변수는 커널의 전역 공간에 쌓입니다. marimo도 비슷하게, 각 셀에서 반환하는 변수는 노트북 전체에서 접근 가능한 공유 공간에 놓입니다. 아래 예시를 보겠습니다.
# Cell 1 — base_price 정의base_price = 10000
# Cell 2 — base_price를 참조해 tax 계산tax = base_price * 0.1
# Cell 3 — base_price와 tax를 모두 참조total = base_price + taxtotal
Cell 1에서 정의한 base_price를 Cell 2와 Cell 3에서 그대로 사용할 수 있습니다. 세 셀이 같은 네임스페이스를 공유하기 때문입니다.
변수 단일 정의 규칙
공유 네임스페이스에는 중요한 제약이 하나 있습니다. 같은 변수를 두 개 이상의 셀에서 정의하면 안 됩니다. 어느 셀의 값을 사용해야 하는지 marimo가 결정할 수 없기 때문입니다.
# Cell 1discount = 0.1# Cell 2discount = 0.2 # MB002 에러 발생
marimo는 이 상황을 MB002: multiple-definitions 에러로 알립니다. discount가 Cell 1과 Cell 2 두 곳에서 정의되어 있으므로, 어느 값을 써야 하는지 알 수 없습니다.
이것은 Jupyter와 다른 점입니다. Jupyter에서는 같은 변수를 여러 셀에서 재정의하는 것이 가능하고 실험 중에 자주 쓰이는 패턴이기도 합니다. marimo에서는 이 패턴이 금지되어 있습니다.
에러 해결법: 변수명 분리와 셀 병합
MB002 에러를 해결하는 방법은 두 가지입니다.
방법 1: 변수명을 다르게 합니다.
# Cell 1 — 기본 할인율default_discount = 0.1# Cell 2 — 이벤트 할인율event_discount = 0.2
두 셀이 서로 다른 변수를 정의하므로 문제가 없습니다.
방법 2: 하나의 셀에서 조건 분기로 처리합니다.
# Cell 1 — 하나의 셀에서 분기 처리is_event = Truediscount = 0.2 if is_event else 0.1
어느 방법이 더 나은지는 상황에 따라 다릅니다. 두 할인율이 서로 독립적이라면 다른 이름을 쓰는 것이 명확합니다. 런타임 조건에 따라 하나를 선택해야 한다면 셀 병합이 더 자연스럽습니다.
셀-로컬 변수: 언더스코어 접두사
가끔 임시 계산에 쓸 변수를 만들어야 하는데, 그 변수가 다른 셀에서 참조될 필요도 없고 이름이 다른 셀의 변수와 충돌할 걱정도 하기 싫은 경우가 있습니다. 이럴 때 언더스코어(_) 접두사를 붙입니다.
# Cell 1_temp = [1, 2, 3, 4, 5] # 셀-로컬 변수 — 다른 셀에서 참조 불가result = sum(_temp)result
_temp는 이 셀 안에서만 유효합니다. 다른 셀에서 _temp를 참조하려 하면 에러가 납니다. 이 방식은 같은 _temp라는 임시 이름을 여러 셀에서 독립적으로 사용하고 싶을 때도 유용합니다. 각 셀의 _temp가 서로에게 영향을 주지 않습니다.
marimo .py 파일 구조
marimo 노트북은 순수 Python 파일(.py)로 저장됩니다. 에디터에서 만든 셀 하나가 파일에서는 어떻게 표현되는지 확인해봅니다.
import marimoapp = marimo.App()@app.celldef _(): base_price = 10000 return (base_price,)@app.celldef _(base_price): tax = base_price * 0.1 return (tax,)@app.celldef _(base_price, tax): total = base_price + tax return (total,)
몇 가지 특징을 볼 수 있습니다.
@app.cell데코레이터가 셀 하나를 나타냅니다.- 함수의 매개변수 이름이 의존하는 변수입니다.
_(base_price)는 "이 셀이base_price에 의존한다"는 뜻입니다. return (변수,)형태로 이 셀이 외부에 제공하는 변수를 선언합니다.- 매개변수와 리턴문은 marimo가 자동으로 관리합니다. 에디터에서 코드를 작성할 때 직접 신경 쓸 필요가 없습니다.
위 예시는 핵심 구조만 보여주기 위해 두 줄을 생략했습니다. marimo가 실제로 저장하는 파일에는 app = marimo.App() 위에 버전을 기록하는 __generated_with = "0.23.10" 줄이, 파일 맨 끝에는 스크립트로 직접 실행할 때 쓰이는 if __name__ == "__main__": app.run() 블록이 함께 들어갑니다. 두 줄 모두 marimo가 자동으로 추가하므로 직접 작성하지 않아도 됩니다. python notebook.py처럼 노트북을 스크립트로 실행하려면 끝의 이 블록이 필요합니다.
파일 형식이 JSON이 아닌 Python이기 때문에 git diff가 코드 변경 내용만 보여줍니다. Jupyter의 .ipynb처럼 출력값이 섞이지 않습니다.
정리
- marimo의 모든 셀은 하나의 전역 네임스페이스를 공유합니다.
- 같은 변수를 두 개 이상의 셀에서 정의하면 MB002 에러가 발생합니다.
- 해결법은 변수명 분리 또는 셀 병합입니다.
- 셀-로컬 임시 변수가 필요하면
_접두사를 사용합니다. - marimo 노트북은
.py파일로 저장되며 셀 의존 관계는 함수 매개변수와 리턴문으로 표현됩니다.