最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的dict/set/tuple語法深入解析

 更新時間:2025年11月28日 09:36:28   作者:大邳草民  
Python中字典(dict)、集合(set)和元組(tuple)是三種常用的數(shù)據(jù)結(jié)構(gòu),這篇文章主要介紹了Python中dict/set/tuple語法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在 Python 的內(nèi)置容器中,dict、set、tuple 是三種最基礎(chǔ)也最常用的數(shù)據(jù)結(jié)構(gòu)。但對于許多學(xué)習(xí)者而言,它們的語法常常呈現(xiàn)一種“相似又沖突、熟悉卻怪異”的狀態(tài):

  • {} 是空字典,不是空集合
  • {1} 是集合而不是字典
  • (1) 不是元組
  • 1, 卻是元組
  • 空集合必須通過 set() 創(chuàng)建
  • tuple 的“核心”竟然是逗號,而不是括號

這些現(xiàn)象并不是隨意設(shè)計的產(chǎn)物,而是語法解析需求、語言歷史選擇、舊代碼兼容性共同作用的結(jié)果。本文將從 歷史背景、解析機制、符號語義、設(shè)計理念 等多個角度,系統(tǒng)解釋這三類結(jié)構(gòu)的語法設(shè)計邏輯。

1. 為什么 dict 和 set 都使用{}?

  1. dict 是 {} 的“歷史所有者”

    在 Python 的早期版本(Python 1.x),只有字典可以使用花括號表示:

    {"a": 1, "b": 2}
    

    當(dāng)時并無 set 類型,因此 {} 當(dāng)然被直接用作字典字面量。這意味著:

    • {} 與 dict 已深度綁定
    • 大量歷史代碼依賴 {}
    • 無法在不破壞兼容性的前提下更改

    因此,當(dāng) set 在 Python 2.3 被加入語言規(guī)范時,花括號 {} 已無可能作為 set 的完整、自由的字面量語法。

  2. 那為什么 {1} 可以成為一個 set?

    雖然 set 不能完全占用 {},但在特定語法場景下,它依然可以使用花括號表示非空集合:

    {1, 2, 3}
    

    理由非常直接:

    • set 的字面量不包含冒號 :
    • dict 的字面量必須包含鍵值對,如 {key: value}

    因此這兩個結(jié)構(gòu)在語法上可區(qū)分:

    表達形式類型解析依據(jù)
    {key: value}dict存在冒號,確定鍵值映射
    {element1, element2}set無冒號,解析為集合

    特別是:

    {1}  # 可被 unambiguously 解析為 set
    
  3. {} 為什么不能表示空集合?

    因為:

    {} -> 可能是空字典,也可能是空集合
    

    Python 選擇保留 {} 為空字典,這不僅是兼容性的考慮,也是為了保持語法一致性。結(jié)果是:

    {}      # dict
    set()   # 空集合
    

    這種“不對稱的語法”正是最典型的 Python 歷史性選擇之一。

2. 為什么(1)不是元組?括號到底承擔(dān)了什么職責(zé)?

  1. Python 語法中括號的主要功能:表達式分組

    在 Python 中,圓括號的最核心作用不是創(chuàng)建元組,而是:

    對表達式做分組,使其按照括號內(nèi)部的優(yōu)先級優(yōu)先計算。

    例如:

    x = (1 + 2) * 3
    

    你顯然不會認(rèn)為 (1 + 2) 是一個元組。

    同樣地,下面的語句:

    (1)
    

    也被解釋為:

    一個被括號包裹的表達式,表達式結(jié)果為 1
    

    因此它的類型永遠是:

    type((1))  # int
    
  2. 真實決定元組的不是括號,而是逗號

    元組字面量的核心是 逗號 ,。括號只是輔助性的語法結(jié)構(gòu),用于讓逗號組合成一個整體表達式。

    例如:

    (1,)   # 元組
    1,     # 也是元組
    

    其語法規(guī)則可以歸納為:

    Python 通過逗號將多個表達式綁定為序列結(jié)構(gòu);括號只是用于維持表達式邊界的容器。

    因此所有以下表達式都合法:

    a = 1, 2          # tuple
    b = (1, 2)        # tuple
    c = (1, 2,)       # tuple
    d = (1,)          # tuple
    e = 1,            # tuple
    

    但:

    (1)   # int
    

    因為沒有逗號。

  3. 為什么要這樣設(shè)計?

    原因包括:

    • Python 需要一種簡單語法表示“不可變序列”
    • 括號已經(jīng)用于表達式分組,不能讓其過載造成歧義
    • 使用逗號作為核心語義可以避免沖突,也簡化解析器設(shè)計
    • 歷史上 tuple 語法比許多現(xiàn)代語言還要早,屬于較早期的語法傳統(tǒng)

    這導(dǎo)致了 tuple 表面看似奇特,但實際上具有極強的一致性與可解析性。

3. 為什么空 set 必須用set()?

因為:

  • {} 已經(jīng)被 dict 占用
  • set 無法重新奪回空字面量語法
  • 語法解析必須保持單義性(unambiguous)
  • 舊代碼兼容性必須保持

因此:

set()   # 空集合的唯一創(chuàng)建方式

而非空集合可以使用部分字面量語法:

{1, 2, 3}

這也是 Python 中最少見但必須了解的“構(gòu)造器優(yōu)先語法”:空對象依賴構(gòu)造函數(shù),而非空對象使用字面量。

4. dict / set / tuple 的符號為何不統(tǒng)一?語義化設(shè)計原則解析

Python 的容器語法并非追求形式一致,而是遵循:

語法應(yīng)表達“結(jié)構(gòu)語義”,而不是容器類型本身。

換言之,符號是用來表達數(shù)據(jù)結(jié)構(gòu)的本質(zhì)含義,而不是隨意選擇的符號裝飾。
具體來說:

數(shù)據(jù)結(jié)構(gòu)語義使用符號理由
有序可變序列[]體現(xiàn)“順序序列”結(jié)構(gòu)(與 C 風(fēng)格數(shù)組類似)
有序不可變序列()作為表達式邊界,同時與逗號構(gòu)成元組
鍵值映射{key: value}以冒號表達鍵到值的映射關(guān)系
無重復(fù)集合{element,...}采用與數(shù)學(xué)集合相似的表示法(但不允許空字面量)

這種語法設(shè)計體現(xiàn)了 Python 的核心理念:

  • 類型語義由內(nèi)容推斷,而非由符號決定
  • 符號代表結(jié)構(gòu)意義(mapping、sequence、set-like)
  • 兼容性優(yōu)先
  • 易讀性優(yōu)先
  • 語法規(guī)則盡量保持最小歧義

5. Python 官方與社區(qū)對這些語法“怪現(xiàn)象”的看法

Python 之父 Guido 在多次討論中都坦言,若能重新設(shè)計語言,有些符號可能會選擇不同的形式。但今天 Python 的狀況是:

  • 擁有龐大的歷史代碼庫
  • 大量項目依賴既有語法
  • 更改基礎(chǔ)語法會導(dǎo)致嚴(yán)重破壞性影響
  • 現(xiàn)有方案雖然有“怪現(xiàn)象”,但在語法解析和語義層面高度一致

因此,dict / set / tuple 之間的這些特殊語法差異將會長期存在。

到此這篇關(guān)于Python中dict/set/tuple語法的文章就介紹到這了,更多相關(guān)Python中dict/set/tuple語法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • matplotlib畫混淆矩陣與正確率曲線的實例代碼

    matplotlib畫混淆矩陣與正確率曲線的實例代碼

    混淆矩陣也稱誤差矩陣,是表示精度評價的一種標(biāo)準(zhǔn)格式,下面這篇文章主要給大家介紹了關(guān)于matplotlib畫混淆矩陣與正確率曲線的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 詳解python字符串駐留技術(shù)

    詳解python字符串駐留技術(shù)

    在本文中,我們將深入研究 Python 的內(nèi)部實現(xiàn),并了解 Python 如何使用一種名為字符串駐留(String Interning)的技術(shù),實現(xiàn)解釋器的高性能。
    2021-05-05
  • 詳解Python實現(xiàn)字典合并的四種方法

    詳解Python實現(xiàn)字典合并的四種方法

    這篇文章主要為大家詳細(xì)介紹了Python的合并字典的四種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • keras 回調(diào)函數(shù)Callbacks 斷點ModelCheckpoint教程

    keras 回調(diào)函數(shù)Callbacks 斷點ModelCheckpoint教程

    這篇文章主要介紹了keras 回調(diào)函數(shù)Callbacks 斷點ModelCheckpoint教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python函數(shù)的嵌套詳解

    Python函數(shù)的嵌套詳解

    這篇文章主要為大家介紹了Python函數(shù)的嵌套,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • matplotlib 曲線圖 和 折線圖 plt.plot()實例

    matplotlib 曲線圖 和 折線圖 plt.plot()實例

    這篇文章主要介紹了matplotlib 曲線圖 和 折線圖 plt.plot()實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Django如何與Ajax交互

    Django如何與Ajax交互

    Django前端模板向后端發(fā)送POST請求主要有兩種方式:form表單和ajax請求。本文將詳細(xì)介紹Django與Ajax的交互方式,如何通過csrftoken認(rèn)證,并提供了兩個具體示例。
    2021-04-04
  • python numpy創(chuàng)造圖像矩陣示例詳解

    python numpy創(chuàng)造圖像矩陣示例詳解

    這篇文章主要為大家介紹了python numpy創(chuàng)造圖像矩陣示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Python文件循環(huán)寫入行時防止覆蓋的解決方法

    Python文件循環(huán)寫入行時防止覆蓋的解決方法

    今天小編就為大家分享一篇Python文件循環(huán)寫入行時防止覆蓋的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 解決python xlrd無法讀取excel文件的問題

    解決python xlrd無法讀取excel文件的問題

    今天小編就為大家分享一篇解決python xlrd無法讀取excel文件的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論

布尔津县| 永新县| 社会| 滦南县| 德化县| 南宁市| 鸡东县| 双牌县| 海城市| 临邑县| 扬中市| 修水县| 乐平市| 兰溪市| 方正县| 翁牛特旗| 鞍山市| 棋牌| 敦煌市| 军事| 炉霍县| 禄丰县| 贵港市| 信阳市| 花垣县| 连云港市| 东乡族自治县| 平顶山市| 布拖县| 迭部县| 丰城市| 静海县| 蓬安县| 公主岭市| 盐池县| 元阳县| 龙游县| 文山县| 北宁市| 新宁县| 淳化县|