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

一文探索CPython的變量實現(xiàn)機制

 更新時間:2025年02月20日 08:18:11   作者:wang_yb  
在Python中,變量的使用看起來非常簡單,然而,這種簡單的賦值操作背后,CPython其實做了很多復雜的工作,下面我們就來一起探索一下吧

Python中,變量的使用看起來非常簡單,例如 a = 10,s = "hello"等等。

然而,這種簡單的賦值操作背后,CPython其實做了很多復雜的工作。

本文將通過一些簡單易懂的代碼示例,一起探索Python變量背后的奧秘,讓我們對它的實現(xiàn)機制有更深一步的理解。

1. 變量到底是什么?

Python中,變量本質上是一個名字到值的映射。

例如,當你寫a = 1時,a是一個名字,而1是一個值。

CPython會將這個名字關聯(lián)起來,以便你后續(xù)可以通過名字訪問這個。

a = 1
print(a)  # 輸出:1

這種映射關系是通過一個名為命名空間的結構實現(xiàn)的。

命名空間是一個字典,其中的鍵是變量名,值是變量對應的對象。

它的定義可參考CPython源碼中的Include/internal/pycore_frame.h文件。

typedef struct _PyInterpreterFrame {
    // 省略... ...
    PyObject *f_globals; /* Borrowed reference. Only valid if not on C stack */
    PyObject *f_builtins; /* Borrowed reference. Only valid if not on C stack */
    PyObject *f_locals; /* Strong reference, may be NULL. Only valid if not on C stack */
    // 省略... ...
}

其中,f_locals 保存局部變量映射,函數(shù)執(zhí)行時,局部變量值存于此;

f_globals 用于全局變量,模塊級代碼塊執(zhí)行時,f_globals 指向模塊全局命名空間字典;

f_builtins 關聯(lián)內置命名空間。

2. 變量的底層實現(xiàn):字節(jié)碼

CPython在執(zhí)行代碼時,會先將代碼編譯成字節(jié)碼,然后由虛擬機執(zhí)行這些字節(jié)碼。我們可以通過 dis 模塊查看代碼的字節(jié)碼。

例如,對于a = 1,字節(jié)碼如下:

import dis

code = """
a = b
"""
dis.dis(code)

  • LOAD_NAME:從命名空間中加載變量b的值
  • STORE_NAME:將值存儲到變量a

這兩個指令展示了CPython如何處理變量的讀取和賦值。

3. 命名空間與作用域

Python中的變量存儲在不同的命名空間中,而這些命名空間又與代碼的作用域相關,作用域決定了變量的可見性。

Python有三種主要的作用域:

  • 局部作用域:函數(shù)內部的變量
  • 全局作用域:模塊級別的變量
  • 內置作用域:包含內置函數(shù)和類型的命名空間
x = "global"  # 全局變量

def func():
    y = "local"  # 局部變量
    print(x)  # 輸出:global
    print(y)  # 輸出:local

func()

在這個例子中,x是全局變量,y是局部變量。

如果在函數(shù)中嘗試訪問一個未定義的變量,CPython會按照以下順序查找:

  • 局部命名空間(f_locals
  • 全局命名空間(f_globals
  • 內置命名空間(f_builtins

如果仍然找不到,就會拋出NameError異常。

4. 不同變量的字節(jié)碼

CPython為不同作用域的變量提供了不同的字節(jié)碼指令,以優(yōu)化性能和實現(xiàn)特定的行為。

4.1. 局部變量

在函數(shù)中,局部變量使用LOAD_FASTSTORE_FAST指令。

這些指令直接操作一個數(shù)組,而不是字典,因此速度更快。

def func():
    a = 1  # STORE_FAST
    b = a  # LOAD_FAST
    return b

dis.dis(func)

4.2. 全局變量

全局變量使用LOAD_GLOBALSTORE_GLOBAL指令。

這些指令會直接操作全局命名空間。

x = 1

def func():
    global x
    x = 2  # STORE_GLOBAL
    return x  # LOAD_GLOBAL

dis.dis(func)

4.3. 閉包變量

當函數(shù)嵌套時,內部函數(shù)可以訪問外部函數(shù)的變量。

這些變量稱為閉包變量,使用LOAD_DEREFSTORE_DEREF指令。

def outer():
    x = 1
    def inner():
        return x  # LOAD_DEREF
    return inner

dis.dis(outer)

5. 類中的變量

在類定義中,變量的行為與函數(shù)不同。

類定義中的變量使用LOAD_NAMESTORE_NAME指令,因為類的命名空間會動態(tài)地與全局命名空間交互。

x = "global"

class MyClass:
    print(x)  # 使用 LOAD_NAME
    x = "local"
    print(x)  # 使用 LOAD_NAME

MyClass()

輸出:

查看指令的話,可以使用:python.exe -m dis .\cpython-variable.py命令。

如果在類中使用嵌套函數(shù),CPython會使用LOAD_CLASSDEREF指令來處理閉包變量。

class MyClass:
    x = "cell"
    def method(self):
        print(x)  # 使用 LOAD_CLASSDEREF

MyClass().method()

6. 編譯器如何選擇指令

CPython的編譯器會根據(jù)變量的作用域和代碼塊類型選擇合適的字節(jié)碼指令。

例如:

  • 如果變量是局部變量,編譯器會生成LOAD_FASTSTORE_FAST
  • 如果變量是全局變量,編譯器會生成LOAD_GLOBALSTORE_GLOBAL
  • 如果變量是閉包變量,編譯器會生成LOAD_DEREFSTORE_DEREF

7. 總結

Python變量的實現(xiàn)機制比看起來復雜得多,它涉及到字節(jié)碼指令、命名空間、作用域以及編譯器的決策邏輯。

通過理解這些概念,可以更好地掌握Python的變量行為,尤其是在復雜的作用域場景中。

如果對CPython的實現(xiàn)感興趣,可以進一步閱讀其源碼中與變量相關的部分。

以上就是一文探索CPython的變量實現(xiàn)機制的詳細內容,更多關于CPython變量的資料請關注腳本之家其它相關文章!

相關文章

  • Python實現(xiàn)從網(wǎng)絡攝像頭拉流的方法分享

    Python實現(xiàn)從網(wǎng)絡攝像頭拉流的方法分享

    這篇文章主要為大家詳細介紹了Python實現(xiàn)從網(wǎng)絡攝像頭拉流的幾種方法,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-01-01
  • 在python中的socket模塊使用代理實例

    在python中的socket模塊使用代理實例

    這篇文章主要介紹了在python中的socket模塊使用代理實例,調用socks.setdefaultproxy即可實現(xiàn),需要的朋友可以參考下
    2014-05-05
  • 教你用Python實現(xiàn)短信驗證碼的發(fā)送

    教你用Python實現(xiàn)短信驗證碼的發(fā)送

    當我們在注冊一個網(wǎng)頁時,有的網(wǎng)頁會讓必須要短信驗證、郵箱驗證,才可以進行賬號的注冊,下面這篇文章主要給大家介紹了關于用Python實現(xiàn)短信驗證碼發(fā)送的相關資料,需要的朋友可以參考下
    2022-12-12
  • Python基于paramiko庫操作遠程服務器的實現(xiàn)

    Python基于paramiko庫操作遠程服務器的實現(xiàn)

    本文主要介紹了使用Python的Paramiko庫來操作遠程服務器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • python如何繪制路段時變車速熱力圖

    python如何繪制路段時變車速熱力圖

    本文通過熱力圖形式展示了24小時內某個路段的車速變化和特定時刻某條路徑的車速情況,數(shù)據(jù)是通過Numpy隨機生成的,用以模擬真實的車速情況,文章還展示了如何利用pandas和seaborn庫中的pivot_table()和heatmap()函數(shù)生成熱力圖
    2024-09-09
  • 如何使用python批量修改文本文件編碼格式

    如何使用python批量修改文本文件編碼格式

    把文本文件的編碼格式進行批量幻化,比如ascii, gb2312, utf8等,相互轉化,字符集的大小來看,utf8>gb2312>ascii,因此最好把gb2312轉為utf8,否則容易出現(xiàn)亂碼,這篇文章主要介紹了如何使用python批量修改文本文件編碼格式,需要的朋友可以參考下
    2023-03-03
  • 使用python實現(xiàn)excel的Vlookup功能

    使用python實現(xiàn)excel的Vlookup功能

    這篇文章主要介紹了使用python實現(xiàn)excel的Vlookup功能,當我們想要查找的數(shù)據(jù)量較大時,這時則有請我們的主角VLookup函數(shù)出場,那么如何用python實現(xiàn)VLookup呢,需要的朋友可以參考下
    2023-04-04
  • Python hashlib庫數(shù)據(jù)安全加密必備指南

    Python hashlib庫數(shù)據(jù)安全加密必備指南

    這篇文章主要為大家介紹了Python hashlib庫數(shù)據(jù)安全加密的使用實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Python圖像處理之對比兩張圖片的差異示例

    Python圖像處理之對比兩張圖片的差異示例

    這篇文章主要給大家介紹了關于Python圖像處理之對比兩張圖片的差異,Python提供了一些庫和工具可以用于圖片的相似度比對,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • 詳解Python 函數(shù)參數(shù)的拆解

    詳解Python 函數(shù)參數(shù)的拆解

    這篇文章主要介紹了Python 函數(shù)參數(shù)的拆解,幫助大家更好的理解和學習python,感興趣的朋友可以了解下
    2020-09-09

最新評論

江口县| 白朗县| 炎陵县| 磐安县| 永德县| 祁连县| 上高县| 新乡市| 静乐县| 乌恰县| 鄂托克前旗| 庆云县| 佛山市| 富裕县| 南漳县| 资中县| 新民市| 大庆市| 军事| 承德市| 玉门市| 宣威市| 前郭尔| 任丘市| 舟曲县| 台中县| 彭水| 巴楚县| 瑞安市| 青阳县| 衡山县| 子长县| 随州市| 米泉市| 任丘市| 麦盖提县| 同江市| 资溪县| 孙吴县| 游戏| 商丘市|