宗教改革的連鎖反應:當權威崩解|文藝復興的數位重生 #07
1520年12月10日
維騰堡廣場。
馬丁.路德站在一堆燃燒的書籍前。
這不是普通的書——這是教宗良十世發出的敕令,要求路德收回他的「異端言論」。
路德的回應?
把教宗的敕令扔進火裡。
這一刻,千年的權威開始崩解。
3年前(1517年10月31日),路德只是在教堂門上釘了95條論綱,批評贖罪券的販賣。
教會以為這只是又一個不滿的僧侶,很快就能壓制。
他們錯了。
因為有了印刷術,路德的95條論綱:
- 2週內傳遍德意志
- 2個月內傳遍整個歐洲
教會想壓制已經來不及。
思想已經像病毒一樣擴散。
但更重要的是:路德打開了潘朵拉的盒子。
如果教會可以被質疑,那麼:
- 誰決定什麼是真理?
- 誰有權解釋聖經?
- 個人能否直接與上帝溝通?
- 教宗真的代表上帝嗎?
- 國王的權力從何而來?
這些問題引發了連鎖反應。
最終:130年戰爭,800萬人死亡,歐洲永久分裂。
讀完這篇文章,你會得到:
✓ 地理擴散分析:宗教改革如何在50年內傳遍北歐,Python地圖視覺化
✓ 三十年戰爭數據:1618-1648,德意志地區人口損失30-40%的量化分析
✓ 經濟影響對比:新教 vs 天主教地區,100年GDP增長差異
✓ Python完整實現:650+行程式碼(基礎版),含地理擴散、人口損失、經濟對比
✓ 宗教裁判所統計:西班牙、義大利宗教審判的殘酷數據
✓ 權威崩解模型:當絕對權威被挑戰,連鎖反應如何發生
✓ 完整數據集:7個CSV檔案,含改革傳播、戰爭參與國、人口損失、經濟增長
路德的三大革命性主張
路德到底說了什麼,讓整個歐洲為之震動?
主張一:唯獨信仰(Sola Fide)
傳統天主教:
- 得救需要:信仰 + 善行 + 教會聖禮 + 贖罪券
- 只有教會能赦罪
- 煉獄存在,可以用錢縮短煉獄時間
路德的革命:
「人稱義是因著信,不在乎遵行律法。」
只要信仰耶穌,就能得救。不需要教會中介,不需要贖罪券。
破壞性:
- 教會失去了對救贖的壟斷權
- 贖罪券生意崩潰(教會主要收入來源)
- 神父的角色被削弱
想像一下:如果你經營一家公司,主要產品是「通往天堂的門票」,突然有人說「其實不需要買票」——你的生意會瞬間崩潰。
主張二:唯獨聖經(Sola Scriptura)
傳統天主教:
- 聖經 + 教會傳統 + 教宗敕令 = 真理的三個來源
- 只有教會能正確解釋聖經
- 平民不該讀聖經(拉丁文,看不懂)
路德的革命:
「聖經是唯一的權威,每個人都能閱讀和解釋。」
路德將聖經翻譯成德文(1522年),讓普通人也能讀懂。
這本德文聖經賣出30萬冊,成為當時的超級暢銷書。
破壞性:
- 教會失去了對真理的解釋權
- 每個人都能自己理解信仰
- 權威從機構轉移到文本
這就像是把原始碼開源——當每個人都能看到程式碼,權威就無法再靠「黑箱」維持。
主張三:信徒皆祭司(Priesthood of All Believers)
傳統天主教:
- 神職人員(教宗、主教、神父)是特殊階級
- 只有他們能主持聖禮、赦罪
- 他們是上帝與人之間的中介
路德的革命:
「所有信徒都是祭司,不需要中介。」
每個信徒都能直接與上帝溝通,不需要神父作為中間人。
破壞性:
- 打破了階級制度
- 削弱了教會的控制力
- 賦予個人精神自主權
這是徹底的去中心化——從中心化的教會體系,轉向分散式的個人信仰。
Python分析:宗教改革的地理擴散
理論說夠了,讓我們用數據看改革如何傳播。
程式一:地理擴散視覺化
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 設定中文字體
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
print("=" * 70)
print("宗教改革地理擴散分析(1517-1570)")
print("=" * 70)
# ===== 讀取數據 =====
df = pd.read_csv('article_07_reformation_spread.csv')
print(f"\n追蹤 {len(df)} 個主要城市")
print(f"時間範圍:{df['reform_year'].min()}-{df['reform_year'].max()}")
# 按年份排序
df = df.sort_values('reform_year')
print("\n" + "=" * 70)
print("改革時間線(前10個城市)")
print("=" * 70)
print(f"{'城市':<15} {'國家':<12} {'年份':<8} {'改革者':<20} {'教派':<15}")
print("-" * 80)
for _, row in df.head(10).iterrows():
print(f"{row['city']:<15} {row['country']:<12} {row['reform_year']:<8} "
f"{row['reformer']:<20} {row['denomination']:<15}")
# ===== 視覺化地理分布 =====
fig, ax = plt.subplots(figsize=(14, 10))
# 按年份上色
scatter = ax.scatter(df['longitude'], df['latitude'],
c=df['reform_year'],
s=300, cmap='YlOrRd', alpha=0.7,
edgecolors='black', linewidth=1.5)
# 標註城市名
for _, row in df.iterrows():
ax.annotate(row['city'],
xy=(row['longitude'], row['latitude']),
xytext=(3, 3), textcoords='offset points',
fontsize=9,
bbox=dict(boxstyle='round,pad=0.3',
facecolor='yellow', alpha=0.6))
ax.set_xlabel('經度', fontsize=13)
ax.set_ylabel('緯度', fontsize=13)
ax.set_title('宗教改革的地理擴散(1517-1570)', fontsize=15, pad=20)
# 顏色條
cbar = plt.colorbar(scatter, ax=ax)
cbar.set_label('改革年份', fontsize=12)
plt.tight_layout()
plt.savefig('reformation_geographic_spread.png', dpi=300, bbox_inches='tight')
plt.show()
print("\n地理擴散圖已保存:reformation_geographic_spread.png")
關鍵發現:
第一波(1517-1525):德意志
- 維騰堡(1517)- 路德
- 蘇黎世(1519)- 慈運理
- 斯特拉斯堡(1523)
第二波(1526-1540):北歐擴散
- 斯德哥爾摩(1527)- 瑞典國王
- 哥本哈根(1536)- 丹麥國王
- 日內瓦(1536)- 加爾文
第三波(1541-1570):西歐與東歐
- 蘇格蘭(1560)- 約翰·諾克斯
- 荷蘭(1566)- 加爾文派
模式:從德意志向外輻射,沿著貿易路線傳播。
程式二:三十年戰爭人口損失
# ===== 讀取戰爭數據 =====
war_df = pd.read_csv('article_07_war_population_losses.csv')
print("\n" + "=" * 70)
print("三十年戰爭(1618-1648)人口損失")
print("=" * 70)
print(f"\n{'地區':<20} {'戰前人口':<15} {'戰後人口':<15} "
f"{'損失%':<10} {'主因':<20}")
print("-" * 85)
total_loss = 0
total_pre = 0
for _, row in war_df.iterrows():
loss = row['pre_war_population'] - row['post_war_population']
total_loss += loss
total_pre += row['pre_war_population']
print(f"{row['region']:<20} {row['pre_war_population']:>12,} "
f"{row['post_war_population']:>12,} "
f"{row['population_loss_pct']:>8}% "
f"{row['primary_cause']:<20}")
overall_loss_pct = (total_loss / total_pre) * 100
print("\n" + "=" * 70)
print(f"總計:")
print(f"戰前人口:{total_pre:,}")
print(f"戰後人口:{total_pre - total_loss:,}")
print(f"總損失:{total_loss:,}({overall_loss_pct:.1f}%)")
print("=" * 70)
# ===== 視覺化 =====
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 7))
# 左圖:人口損失對比
regions = war_df['region'].values
pre_war = war_df['pre_war_population'].values
post_war = war_df['post_war_population'].values
x = np.arange(len(regions))
width = 0.35
ax1.bar(x - width/2, pre_war, width, label='戰前', color='green', alpha=0.7)
ax1.bar(x + width/2, post_war, width, label='戰後', color='red', alpha=0.7)
ax1.set_xlabel('地區', fontsize=12)
ax1.set_ylabel('人口', fontsize=12)
ax1.set_title('三十年戰爭人口損失對比', fontsize=14, pad=15)
ax1.set_xticks(x)
ax1.set_xticklabels(regions, rotation=45, ha='right')
ax1.legend()
ax1.grid(axis='y', alpha=0.3)
# 右圖:損失百分比
colors = ['#d62728' if pct > 30 else '#ff7f0e' for pct in war_df['population_loss_pct']]
ax2.barh(regions, war_df['population_loss_pct'], color=colors, alpha=0.7)
ax2.set_xlabel('人口損失%', fontsize=12)
ax2.set_title('各地區人口損失率', fontsize=14, pad=15)
ax2.grid(axis='x', alpha=0.3)
plt.tight_layout()
plt.savefig('thirty_years_war_casualties.png', dpi=300, bbox_inches='tight')
plt.show()
print("\n人口損失圖已保存:thirty_years_war_casualties.png")輸出結果:
======================================================================
三十年戰爭(1618-1648)人口損失
======================================================================
地區 戰前人口 戰後人口 損失% 主因
-------------------------------------------------------------------------------------
波希米亞 1,700,000 980,000 42% 戰爭+饑荒+瘟疫
巴伐利亞 1,000,000 600,000 40% 瑞典入侵+瘟疫
符騰堡 450,000 120,000 73% 徹底破壞
梅克倫堡 300,000 100,000 67% 戰爭+人口外流
波美拉尼亞 200,000 60,000 70% 瑞典佔領
布蘭登堡 350,000 175,000 50% 戰爭+疾病
薩克森 750,000 450,000 40% 戰爭損失
普法爾茨 500,000 250,000 50% 多次入侵
======================================================================
總計:
戰前人口:5,250,000
戰後人口:2,735,000
總損失:2,515,000(47.9%)
======================================================================
Dataview (inline field '=====================================================================
三十年戰爭(1618-1648)人口損失
======================================================================
地區 戰前人口 戰後人口 損失% 主因
-------------------------------------------------------------------------------------
波希米亞 1,700,000 980,000 42% 戰爭+饑荒+瘟疫
巴伐利亞 1,000,000 600,000 40% 瑞典入侵+瘟疫
符騰堡 450,000 120,000 73% 徹底破壞
梅克倫堡 300,000 100,000 67% 戰爭+人口外流
波美拉尼亞 200,000 60,000 70% 瑞典佔領
布蘭登堡 350,000 175,000 50% 戰爭+疾病
薩克森 750,000 450,000 40% 戰爭損失
普法爾茨 500,000 250,000 50% 多次入侵
======================================================================
總計:
戰前人口:5,250,000
戰後人口:2,735,000
總損失:2,515,000(47.9%)
======================================================================'): Error:
-- PARSING FAILED --------------------------------------------------
> 1 | =====================================================================
| ^
2 | 三十年戰爭(1618-1648)人口損失
3 | ======================================================================
Expected one of the following:
'(', 'null', boolean, date, duration, file link, list ('[1, 2, 3]'), negated field, number, object ('{ a: 1, b: 2 }'), string, variable
震撼的數字:
德意志地區整體人口損失48%。
某些地區(符騰堡、梅克倫堡、波美拉尼亞)損失超過70%。
這不只是戰爭死亡,還包括:
- 饑荒(農田被毀)
- 瘟疫(衛生崩潰)
- 人口外流(難民逃亡)
這是德意志歷史上最慘烈的災難,直到二戰才被超越。
程式三:新教vs天主教經濟對比
# ===== 經濟增長對比 =====
econ_df = pd.read_csv('article_07_economic_growth_comparison.csv')
print("\n" + "=" * 70)
print("新教 vs 天主教地區經濟增長(1600-1700)")
print("=" * 70)
print(f"\n{'年份':<10} {'新教GDP指數':<15} {'天主教GDP指數':<18} {'新教優勢':<12}")
print("-" * 70)
for _, row in econ_df.iterrows():
print(f"{row['year']:<10} {row['protestant_gdp_index']:<15.1f} "
f"{row['catholic_gdp_index']:<18.1f} "
f"{row['protestant_advantage']:>10.1f}%")
# 視覺化
fig, ax = plt.subplots(figsize=(14, 8))
ax.plot(econ_df['year'], econ_df['protestant_gdp_index'],
'b-o', linewidth=3, markersize=10, label='新教地區')
ax.plot(econ_df['year'], econ_df['catholic_gdp_index'],
'r-s', linewidth=3, markersize=10, label='天主教地區')
ax.fill_between(econ_df['year'],
econ_df['protestant_gdp_index'],
econ_df['catholic_gdp_index'],
alpha=0.3, color='blue')
ax.set_xlabel('年份', fontsize=13)
ax.set_ylabel('GDP指數(1600=100)', fontsize=13)
ax.set_title('新教 vs 天主教地區經濟增長對比', fontsize=15, pad=20)
ax.legend(fontsize=12)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('protestant_vs_catholic_economy.png', dpi=300, bbox_inches='tight')
plt.show()
print("\n經濟對比圖已保存:protestant_vs_catholic_economy.png")輸出結果:
======================================================================
新教 vs 天主教地區經濟增長(1600-1700)
======================================================================
年份 新教GDP指數 天主教GDP指數 新教優勢
----------------------------------------------------------------------
1600 100.0 100.0 0.0%
1625 112.3 98.5 14.0%
1650 98.2 82.4 19.2%(戰後恢復差異)
1675 145.8 105.3 38.5%
1700 198.4 128.7 54.1%
Dataview (inline field '=====================================================================
新教 vs 天主教地區經濟增長(1600-1700)
======================================================================
年份 新教GDP指數 天主教GDP指數 新教優勢
----------------------------------------------------------------------
1600 100.0 100.0 0.0%
1625 112.3 98.5 14.0%
1650 98.2 82.4 19.2%(戰後恢復差異)
1675 145.8 105.3 38.5%
1700 198.4 128.7 54.1%'): Error:
-- PARSING FAILED --------------------------------------------------
> 1 | =====================================================================
| ^
2 | 新教 vs 天主教地區經濟增長(1600-1700)
3 | ======================================================================
Expected one of the following:
'(', 'null', boolean, date, duration, file link, list ('[1, 2, 3]'), negated field, number, object ('{ a: 1, b: 2 }'), string, variable
驚人差距:
100年後(1700年),新教地區GDP增長98.4%,天主教地區只增長28.7%。
新教地區經濟增速快54.1%!
為什麼?
韋伯假說(馬克斯·韋伯,《新教倫理與資本主義精神》):
- 新教強調勤奮、節儉、職業召喚
- 天主教強調施捨、慈善、修道
- 新教鼓勵資本累積→商業發展
實證數據支持這個假說。
程式四:宗教裁判所統計
# ===== 宗教裁判所數據 =====
inquisition_df = pd.read_csv('article_07_inquisition_statistics.csv')
print("\n" + "=" * 70)
print("宗教裁判所統計(反宗教改革)")
print("=" * 70)
print(f"\n{'國家':<12} {'期間':<18} {'總審判':<12} {'總處決':<12} "
f"{'處決率':<10} {'主要目標':<20}")
print("-" * 90)
for _, row in inquisition_df.iterrows():
period = f"{row['start_year']}-{row['end_year']}"
print(f"{row['country']:<12} {period:<18} {row['total_trials']:>10,} "
f"{row['total_executed']:>10,} "
f"{row['execution_rate']:>8.1f}% "
f"{row['primary_targets']:<20}")
# 視覺化
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 7))
# 左圖:審判與處決數量
countries = inquisition_df['country'].values
trials = inquisition_df['total_trials'].values
executed = inquisition_df['total_executed'].values
x = np.arange(len(countries))
width = 0.35
ax1.bar(x - width/2, trials, width, label='總審判', color='orange', alpha=0.7)
ax1.bar(x + width/2, executed, width, label='總處決', color='red', alpha=0.7)
ax1.set_ylabel('人數', fontsize=12)
ax1.set_title('宗教裁判所審判與處決', fontsize=14, pad=15)
ax1.set_xticks(x)
ax1.set_xticklabels(countries)
ax1.legend()
ax1.grid(axis='y', alpha=0.3)
# 右圖:處決率
ax2.barh(countries, inquisition_df['execution_rate'],
color='darkred', alpha=0.7)
ax2.set_xlabel('處決率%', fontsize=12)
ax2.set_title('處決率對比', fontsize=14, pad=15)
ax2.grid(axis='x', alpha=0.3)
plt.tight_layout()
plt.savefig('inquisition_statistics.png', dpi=300, bbox_inches='tight')
plt.show()
print("\n宗教裁判所圖表已保存:inquisition_statistics.png")
print("\n✓ 這是天主教會試圖用恐怖手段壓制改革")
print("✓ 但最終失敗了——改革已經無法逆轉")
輸出結果:
======================================================================
宗教裁判所統計(反宗教改革)
======================================================================
國家 期間 總審判 總處決 處決率 主要目標
------------------------------------------------------------------------------------------
西班牙 1478-1834 150,000 3,000 2.0% 猶太教徒+新教徒
義大利 1542-1761 75,000 1,250 1.7% 新教徒+異端
葡萄牙 1536-1821 40,000 1,175 2.9% 猶太教徒+異端
荷蘭 1523-1566 5,000 1,300 26.0% 新教徒(失敗)
Dataview (inline field '=====================================================================
宗教裁判所統計(反宗教改革)
======================================================================
國家 期間 總審判 總處決 處決率 主要目標
------------------------------------------------------------------------------------------
西班牙 1478-1834 150,000 3,000 2.0% 猶太教徒+新教徒
義大利 1542-1761 75,000 1,250 1.7% 新教徒+異端
葡萄牙 1536-1821 40,000 1,175 2.9% 猶太教徒+異端
荷蘭 1523-1566 5,000 1,300 26.0% 新教徒(失敗)'): Error:
-- PARSING FAILED --------------------------------------------------
> 1 | =====================================================================
| ^
2 | 宗教裁判所統計(反宗教改革)
3 | ======================================================================
Expected one of the following:
'(', 'null', boolean, date, duration, file link, list ('[1, 2, 3]'), negated field, number, object ('{ a: 1, b: 2 }'), string, variable
最殘酷的是荷蘭:處決率26%
因為荷蘭改革運動最激烈,天主教當局(西班牙統治)採用極端手段。
但最終:荷蘭獨立成功,成為新教國家。
恐怖無法阻止思想傳播。
權威崩解的連鎖反應
宗教改革不只改變宗教,更引發了系統性崩解。
第一層:宗教權威崩解
路德質疑教會 →
其他人也開始質疑 →
慈運理、加爾文、諾克斯各自建立教派 →
基督教永久分裂
結果:從一個教會變成數百個教派。
第二層:政治權威受挑戰
如果教宗可以錯,那國王呢?
君權神授理論開始動搖:
- 誰賦予國王權力?真的是神嗎?
- 如果不是,人民能否推翻暴君?
150年後:
- 英國內戰(1642-1651):國王被斬首
- 美國獨立(1776):殖民地推翻英王
- 法國大革命(1789):路易十六被斬首
權威質疑的潘朵拉盒子,再也關不上了。
第三層:知識權威分散
不只宗教,科學也受影響:
傳統:亞里斯多德+聖經=真理
改革後:觀察+實驗=真理
科學革命誕生:
- 哥白尼(日心說,1543)
- 伽利略(望遠鏡觀測,1610)
- 牛頓(萬有引力,1687)
從訴諸權威,到訴諸證據。
結論:崩解的代價與重生
當我用Python分析宗教改革的數據時,我看到了一個殘酷的真相:
打破舊秩序的代價是血腥的。
- 三十年戰爭:800萬人死亡
- 德意志人口:損失48%
- 130年戰爭:歐洲永久分裂
但如果沒有這場崩解:
- 教會仍然壟斷真理
- 個人沒有精神自主權
- 科學革命可能不會發生
- 啟蒙運動不會誕生
- 現代民主無法建立
路德沒有想到,他的95條論綱會引發這場浩劫。
但歷史沒有如果。
當你挑戰絕對權威,連鎖反應就會啟動。
有些系統,一旦開始崩解,就無法停止。
600年後,我們仍然活在那場崩解的餘波之中。
延伸閱讀與資源
系列文章:
- [上一篇] 印刷術的資訊革命:思想如何病毒式傳播 (#6)
- [下一篇] 啟蒙運動的理性革命:數據vs權威 (#8)
- [相關] 從神本到人本:人文主義的思想革命 (#5)
參考資料:
- MacCulloch, Diarmaid. Reformation: Europe’s House Divided. Penguin, 2004.
- Cameron, Euan. The European Reformation. Oxford, 2012.
- Parker, Geoffrey. The Thirty Years’ War. Routledge, 1984.
想深入探索?加入會員獲取完整版
免費版(本文)已包含:
- 地理擴散視覺化
- 三十年戰爭人口損失
- 新教vs天主教經濟對比
- 宗教裁判所統計
會員專屬完整版
進階Python程式碼:
- 50個城市完整網絡
- 詳細戰爭時間線
- 教派分化樹狀圖
- 傳播模擬
- 經濟模型
完整數據集:
- 50個城市改革時間線
- 100+場戰役數據
- 教派系譜圖
- 完整經濟數據
會員價格: NT$350/月
關於Code & Cogito
用程式碼解構歷史,用數據理解哲學。
訂閱Newsletter — 每週精選文章
GitHub — https://github.com/Code-and-Cogito/code-cogito-public
Patreon — Code & Cogito | Patreon
文章資訊
撰寫:Wina
系列:文藝復興的數位重生 #7
© 2025 Code & Cogito
用程式碼解構歷史,用數據理解哲學
