【python基礎】函數-值傳遞

来源:https://www.cnblogs.com/lbprogram/archive/2023/06/19/17490386.html
-Advertisement-
Play Games

為了更好的認識函數,我們還要研究值傳遞問題,再研究這個問題之前,我們已經知道了函數之間的值傳遞,是實參變數值傳遞給形參變數,然後讓形參變數在函數內完成相應的功能。但是因為數據類型的不同,這裡的值傳遞產生的對實參變數的效果是不同的 # 1.傳遞數據本質 參數傳遞之間傳遞的肯定是數據,而這種數據本質上是 ...


為了更好的認識函數,我們還要研究值傳遞問題,再研究這個問題之前,我們已經知道了函數之間的值傳遞,是實參變數值傳遞給形參變數,然後讓形參變數在函數內完成相應的功能。但是因為數據類型的不同,這裡的值傳遞產生的對實參變數的效果是不同的

1.傳遞數據本質

參數傳遞之間傳遞的肯定是數據,而這種數據本質上是地址值。變數有四個要素:名、值、數據類型、地址值。每個變數在創建時都會在記憶體中開闢一定空間,該空間具有地址值,併在該地址裡面存儲數據,Python的變數存儲的數據是地址值,該地址值所代表的是真實數據的地址值,而不是變數的地址值。

1.1不可變數據類型

我們之前介紹過數字、字元串、元組它是不可變的,就是說只要在記憶體中創建了該數據,那麼它是不變的,創建了數字1,那麼數字1是存在的,我們把變數進行運算操作,假設進行加法運算,讓其加1,變為了2,那麼這裡是創建了一個數字2,數字2也是不可變的,原先的數字1還是存在的,只不過我們的變數中儲存的數據是數字2的地址值了。
image
圖中的0x-xx是地址假想值。
id函數在作用於變數時,其返回的是變數指向數據內容的地址值,編寫程式如下所示:
image
參數之間數據的傳遞,就是將實參變數的值賦值給形參變數,這裡我們說的實參變數的值就是實參數據的地址值,編寫程式如下所示:
image
我們通過輸出結果發現,num1、num2、num3所存儲的地址值都是相同的,都為140716513424168,這說明他們都指向同一個數據,也就是數字1,但是經過運算後,num3所存儲的地址值變化了,是因為產生了新數據,新數據的地址賦值給了num3,num3指向了數字2的地址
那麼,經過sum函數後,因為num1、num2的地址是沒有發生改變的,所以我們輸出num1和num2它的結果還是1。
這裡我們是用數字舉例的,換成字元串、元組等都是同樣的道理

1.2可變數據類型

不可變數據類型在記憶體中的表現:當不可變數據類型(數字、字元串、元組)的變數需要更新新值時,其創建一個新值,將舊值的地址更換為新值的地址,此時指向發生改變。
可變數據類型,我們目前瞭解的就是列表、字典,我們可以發現它們都不是一個簡單的數據,而是一組相對複雜的數據集合,數據集合裡面包含的數據類型是任意的,就相當於一個倉庫,可變數據類型變數的數據值是倉庫的地址,而我們所說的可變數據類型變數裡面的數據更新新值時,不是倉庫地址的改變,而是倉庫內數據元素的改變。
所以,可變數據類型在記憶體中的表現:當可變數據類型(列表、字典)變數需要更新數據元素新值時,其創建一個數據元素新值,將新值的地址放進可變數據類型所指向的倉庫裡面,而不是改變可變數據類型變數存儲的倉庫的地址值,其邏輯如下圖所示。
image
圖中的0x-xx是地址假想值。
我們可以做下驗證,編寫程式如下所示:
image
通過輸出結果我們發現,
1.在經過del_first函數之前,輸出列表數據元素為[1,2,3,4]。在經過del_first函數之後,輸出列表數據元素為[2,3,4]這說明改變了實參變數list所指向的地址中的內容,形象化理解,就是改變了倉庫裡面的內容。
2.在經過del_first函數之前,list變數所存儲的地址值為2113656214912。經過del_first函數之後,list變數所存儲的地址值仍為2113656214912。所以說明list變數經過函數操作後,沒有改變其存儲的地址值,形象化理解,就是沒有改變倉庫的地址
3.在經過del_first函數之前,列表數據元素0所存儲的地址為140712759325480,列表數據元素1所存儲的地址為140712759325512。在經過del_first函數之後,列表數據0所存儲的地址為原先列表數據元素1存儲的地址140712759325512,也就是經過刪除第一個數據元素的操作後,所有數據元素都依次往前排列。形象化理解,就是把倉庫中第一個位置的物品拿出來,然後把其他的物品依次往前挪一個位置。
這裡我們是用列表舉例的,換成字典等其他可變數據類型都是同樣的道理

1.3總結

不可變數據類型的實參變數,經過函數操作之後,不會改變其原有內容
可變數據類型的實參變數,經過函數操作之後,會改變其原有內容


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 函數和關鍵字 本篇主要介紹:`自定義函數`、`巨集函數`、`字元串處理函數`和`關鍵字`。 ### 自定義函數 #### 基本用法 實現一個 add() 函數。請看示例: ```c #include // 自定義函數,用於計算兩個整數的和 int add(int a, int b) { // a ...
  • # Rust語言 - 介面設計的建議之顯而易見(Obvious) - [Rust API 指南 GitHub](https://github.com/rust-lang/api-guidelines): - [Rust API 指南 中文](https://rust-chinese-translat ...
  • # 前言 此文章是Java後端接入微信登錄功能,由於項目需要,捨棄瞭解密用戶信息的`session_key`,只保留`openid`用於檢索用戶信息 後端框架:spring boot 小程式框架:uniapp # 流程概括 - 官方流程:通過自定義登錄態與openid,session_key關聯,之 ...
  • ## 1 目標 不在現有查詢代碼邏輯上做任何改動,實現dao維度的數據源切換(即表維度) ## 2 使用場景 節約bdp的集群資源。接入新的寬表時,通常uat驗證後就會停止集群釋放資源,在對應的查詢伺服器uat環境時需要查詢的是生產庫的表數據(uat庫表因為bdp實時任務停止,沒有數據落入),只進行 ...
  • ## 教程簡介 Tapestry並不是一種單純的MVC框架,它更像MVC框架和模板技術的結合,它不僅包含了前端的MVC框架,還包含了一種視圖層的模板技術,使用Tapestry完全可以與Servlet/JSP API分離,是一種非常優秀的設計。 通過使用Tapestry,開發者完全不需要使用JSP技術 ...
  • `Comparable` 介面的 `compareTo` 方法的升序或降序取決於實現該介面的類的具體實現。按照慣例,`compareTo` 方法應該返回負數、零或正數來指示當前對象是小於、等於還是大於傳入的對象。具體來說: - 如果 `this` 對象小於傳入的對象,則 `compareTo` 應該 ...
  • # 1、概述 ## 功能 Elasticsearch 是一個分散式的 RESTful 搜索和分析引擎,可用來集中存儲您的數據,以便您對形形色色、規模不一的數據進行搜索、索引和分析。 例如: - 在電商網站搜索商品 ![image](https://img2023.cnblogs.com/blog/3 ...
  • # Java 運算符的使用 # 1.算術運算符 ## 算術運算符包括: +, -, *, /, %, ++, --,其中需要註意的是%,++,--; ## % 取模運算也叫做取餘,在 Java 中取餘的規則: a % b = a - a / b * b,如果是小數的話是這樣:a % b = a- ( ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...