學習日志37 python

1?Python 和 Java 在類屬性(靜態屬性)和實例屬性的處理

題目

執行以下程序,輸出結果為()
class Base(object):count = 0def __init__(self):pass
b1 = Base()
b2 = Base()
b1.count = b1.count + 1
print(b1.count,end=" ")
print(Base.count,end=" ")
print(b2.count)A 1 1 1
B 1 0 0
C 1 0 1
D 拋出異常正確答案:B

解析

在這個程序中,我們需要理解類屬性和實例屬性的區別:

  1. count = 0?是?Base?類的類屬性,所有實例共享這個屬性
  2. 當我們創建?b1 = Base()?和?b2 = Base()?時,它們最初都沒有自己的?count?實例屬性,會共享類的?count?屬性

關鍵操作是?b1.count = b1.count + 1

  • 這行代碼首先讀取?b1.count,由于?b1?沒有自己的?count?屬性,會讀取類屬性?Base.count(值為 0)
  • 然后創建一個?b1?的實例屬性?count,并賦值為 0 + 1 = 1

此時:

  • b1.count?訪問的是?b1?自己的實例屬性,值為 1
  • Base.count?訪問的是類屬性,仍然保持初始值 0
  • b2.count?訪問的是類屬性(因為?b2?沒有自己的實例屬性),值為 0

所以輸出結果是?1 0 0,正確答案是 B。

【base不用先創造實例嗎?】

在 Python 中,類屬性(如?Base.count)屬于類本身不需要先創建實例就可以直接訪問。

類屬性的特點:

  • 它是類級別的屬性,不屬于任何特定實例
  • 可以通過?類名.屬性名?直接訪問(如?Base.count
  • 所有實例在沒有自己的同名實例屬性時,都會共享這個類屬性

在你提供的代碼中:

  • count = 0?是?Base?類的類屬性,定義后就存在了
  • 即使不創建?b1?和?b2?實例,也可以直接訪問?Base.count(值為 0)

當創建實例后:

  • b1?和?b2?初始時沒有自己的?count?屬性,所以?b1.count?和?b2.count?會指向類屬性?Base.count
  • 直到執行?b1.count = ...?時,才會給?b1?創建一個獨立的實例屬性?count,此時?b1.count?不再指向類屬性

這就是為什么代碼中可以直接訪問?Base.count?而不需要先創建實例的原因。

【這個py和java的語法規則一樣嗎?】

不僅學混了還學忘了。

Python 和 Java 在類屬性(靜態屬性)和實例屬性的處理上有相似之處,但語法和細節實現細節存在差異,主要區別如下:

1.?類屬性的定義與訪問

  • Python
    直接在類中定義的變量就是類屬性,無需特殊關鍵字,可通過?類名.屬性名?或?實例.屬性名(無同名實例屬性時)訪問。
    例:

    python

    運行

    class Base:count = 0  # 類屬性print(Base.count)  # 直接通過類訪問,無需實例化
    
  • Java
    類屬性需要用?static?關鍵字聲明,稱為 “靜態屬性”,必須通過?類名.屬性名?或?實例.屬性名?訪問(推薦用類名)。
    例:

    java

    運行

    class Base {static int count = 0;  // 靜態屬性(類屬性)
    }public class Main {public static void main(String[] args) {System.out.println(Base.count);  // 直接通過類訪問}
    }
    

2.?實例屬性對類屬性的遮蔽(Shadowing)

  • Python
    當實例定義與類屬性同名的實例屬性時,會自動 “遮蔽” 類屬性(實例訪問時優先用自己的屬性,類訪問仍用類屬性)。
    例:

    python

    運行

    b1 = Base()
    b1.count = 1  # 給b1創建實例屬性,遮蔽類屬性
    print(b1.count)  # 1(實例屬性)
    print(Base.count)  # 0(類屬性不受影響)
    
  • Java
    實例不能定義與靜態屬性同名的實例屬性(編譯報錯),避免混淆。
    若嘗試定義:

    java

    運行

    class Base {static int count = 0;int count;  // 編譯錯誤:與靜態屬性重名
    }
    

3.?核心區別總結

場景PythonJava
類屬性聲明直接定義(無關鍵字)必須用?static?關鍵字
類屬性訪問類名。屬性 或 實例。屬性(無同名實例屬性)類名。屬性 或 實例。屬性(推薦類名訪問)
實例與類屬性重名允許(實例屬性遮蔽類屬性)不允許(編譯報錯)
類屬性是否依賴實例化不依賴(類加載時就存在)不依賴(類加載時就存在)

回到原題

如果用 Java 實現類似邏輯,由于不允許實例屬性與靜態屬性重名,b1.count = ...?這樣的代碼會直接編譯報錯。

但 Python 允許這種操作,因此兩者行為不同。

簡單說:語法規則不完全相同,核心差異體現在類屬性的聲明方式和實例屬性與類屬性的重名處理上

2?Python中or運算符的一個重要特性:它返回的是操作數本身,而不是布爾值。

Python 中的?or?運算符有一個重要特性:它返回的是第一個為 “真” 的操作數,而不是單純的布爾值?True?或?False。如果所有操作數都為 “假”,則返回最后一個操作數。

這與許多其他編程語言中?or?僅返回布爾值的行為不同,在 Python 中,or?更像是 "返回第一個真值" 的運算符。

示例:

python

運行

# 返回第一個真值(非空字符串是真值)
print("hello" or 0)  # 輸出: hello# 0是假值,返回第二個操作數
print(0 or "world")  # 輸出: world# 所有都是假值,返回最后一個
print(0 or "" or None)  # 輸出: None# 數字0是假值,非0數字是真值
print(0 or 42)  # 輸出: 42# 空列表是假值,非空列表是真值
print([] or [1, 2, 3])  # 輸出: [1, 2, 3]

這個特性在 Python 中非常實用,可以用來簡潔地設置默認值,例如:

python

運行

def greet(name=None):# 如果name為None(假值),則使用"Guest"作為默認值name = name or "Guest"print(f"Hello, {name}!")greet()  # 輸出: Hello, Guest!
greet("Alice")  # 輸出: Hello, Alice!

理解這個特性有助于寫出更簡潔、更 Pythonic 的代碼。

【和java一樣嗎?不一樣!】

在 Java 中,||?運算符(邏輯或)的行為與 Python 的?or?有本質區別:

Java 的?||?嚴格返回布爾值(true?或?false),不會返回操作數本身。它僅判斷操作數的真假性,最終結果只能是布爾類型。

示例對比:

java

運行

// Java 中 || 返回布爾值
System.out.println("hello" || 0);  // 編譯錯誤(操作數類型不兼容)
System.out.println(0 || 42);      // 編譯錯誤(操作數必須是布爾類型)// 正確用法:操作數為布爾值,結果為布爾值
System.out.println(1 > 0 || 2 > 5);  // 輸出 true
System.out.println(1 < 0 || 2 > 5);  // 輸出 false

而 Python 的?or?如前所述,返回的是第一個為 "真" 的操作數本身(非布爾值),這是兩種語言在設計上的明顯差異。

簡單說:

  • Java 的?||?是 "邏輯或判斷",結果只能是?true/false
  • Python 的?or?是 "取第一個真值",結果是操作數本身

題目

下列Python3代碼運行結果是( )
a = 'a'
print(a > 'b' or 'c')
A a
B b
C c
D True
E False正確答案:C

這道題考查的是 Python 中?or?運算符的特性 —— 它返回的是操作數本身,而不是布爾值,這與許多其他語言不同。

分析代碼?print(a > 'b' or 'c')

  1. 首先計算?a > 'b',其中?a = 'a'。在 Python 中,字符串比較是基于字符的 Unicode 編碼值,'a' 的編碼值小于 'b',所以?a > 'b'?的結果為?False(假值)。
  2. 然后執行?or?運算。or?運算符的邏輯是:如果第一個操作數是真值,則返回第一個操作數;如果第一個操作數是假值,則返回第二個操作數。
  3. 由于?a > 'b'?的結果是?False(假值),所以?or?運算返回第二個操作數?'c'

因此,代碼的輸出結果是?c,正確答案是 C。

3?Python 中可以直接修改原字典的方法

  1. 直接賦值
    通過?dict[key] = value?為已有鍵設置新值,或添加新的鍵值對:

    python

    運行

    d = {"a": 1}
    d["a"] = 100  # 修改已有鍵
    d["b"] = 2    # 添加新鍵值對
    
  2. update()
    合并其他字典或鍵值對到原字典,重復鍵會被覆蓋:

    python

    運行

    d = {"a": 1}
    d.update({"b": 2, "a": 10})  # 原字典變為 {"a": 10, "b": 2}
    
  3. pop(key[, default])
    刪除指定鍵并返回其值,原字典尺寸減小:

    python

    運行

    d = {"a": 1, "b": 2}
    d.pop("a")  # 返回 1,原字典變為 {"b": 2}
    
  4. popitem()
    刪除并返回字典中最后插入的鍵值對(Python 3.7+ 有序):

    python

    運行

    d = {"a": 1, "b": 2}
    d.popitem()  # 返回 ("b", 2),原字典變為 {"a": 1}
    
  5. clear()
    清空字典中所有鍵值對,原字典變為空:

    python

    運行

    d = {"a": 1}
    d.clear()  # 原字典變為 {}
    
  6. setdefault(key[, default])
    若鍵不存在,則添加鍵值對(key: default),原字典被修改:

    python

    運行

    d = {"a": 1}
    d.setdefault("b", 2)  # 原字典變為 {"a": 1, "b": 2}
    

  7. del?語句
    通過?del dict[key]?直接刪除指定鍵:

    python

    運行

    d = {"a": 1}
    del d["a"]  # 原字典變為 {}
    

這些操作都會直接修改原字典本身,而非返回新字典。如果需要保持原字典不變,可先使用?copy()?方法創建副本后再操作。

4?正則表達式中字符集([])的用法

下面字符串中匹配正則的有?mstr = r"red hed ced ped"
regex = r"[^c|p]ed"
pattern = re.compile(regex)
print pattern.findall(mstr)A red
B hed
C ced
D ped正確答案:AB

首先看正則表達式:r"[^c|p]ed"

這里的關鍵是?[^c|p]?這個部分,我們拆開來理解:

  1. []?表示 “字符集”,匹配其中任意一個字符
  2. ^?放在字符集開頭,表示 “取反”,即 “不匹配后面的字符”
  3. 所以?[^c|p]?的意思是:匹配一個 “既不是 c、也不是 |、也不是 p” 的字符
    (注意:|?在這里只是一個普通字符,不是 “或” 的意思,因為在字符集里|沒有特殊含義)

再看被匹配的字符串:"red hed ced ped"

里面有 4 個以?ed?結尾的子串,我們逐個檢查:

  1. red:前面的字符是?r
    r?既不是?c、也不是?|、也不是?p,符合?[^c|p],所以會被匹配。

  2. hed:前面的字符是?h
    h?既不是?c、也不是?|、也不是?p,符合?[^c|p],所以會被匹配。

  3. ced:前面的字符是?c
    c?是?[^c|p]?中明確排除的字符,不符合,所以不會被匹配。

  4. ped:前面的字符是?p
    p?也是?[^c|p]?中明確排除的字符,不符合,所以不會被匹配。

結論

符合正則表達式?r"[^c|p]ed"?的只有?red?和?hed,對應選項?A、B

補充說明

如果想表達 “不是 c 也不是 p”,正確的寫法應該是?[^cp](去掉?|),因為?|?在字符集里是普通字符,會被當成 “需要排除的字符” 之一。原正則?[^c|p]?多排除了一個?|,但不影響這道題的結果(因為字符串里沒有?|)。(看來是起到迷惑作用的)

理解字符集的 “取反” 邏輯是關鍵,多練習幾個例子就會熟悉啦~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93590.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93590.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對于QPS的理解和簡單

QPS&#xff08;Queries Per Second&#xff09; 是衡量系統吞吐量的核心指標&#xff0c;表示每秒能處理的請求數量。以下是關于QPS的完整解析和實踐指南&#xff1a;一、QPS的核心公式 QPS 總請求量 / 請求總時間&#xff08;秒&#xff09;典型場景計算&#xff1a; 日請求…

【筆記ing】考試腦科學 腦科學中的高效記憶法

前言本書是拙作《高中生學習法》的修訂版。《高中生學習法》出版已有十余年。這期間&#xff0c;腦科學研究不斷進步&#xff0c;十幾年前無法解釋的事情現在已經開始逐漸明晰。同時&#xff0c;書中有些內容甚至已經被明確證實是錯誤的。也就是說&#xff0c;《高中生學習法》…

Web安全 - 構建安全可靠的API:基于國密SM2/SM3的文件上傳方案深度解析

文章目錄概述1. 緣起&#xff1a;挑戰與目標2 . 核心架構&#xff1a;非對稱簽名與摘要算法的珠聯璧合威脅模型&#xff08;我們要防的攻擊&#xff09;密鑰管理體系3 . 簽名與驗證&#xff1a;一步一解&#xff0c;安全閉環3.1 A系統&#xff1a;簽名的生成&#xff08;請求前…

【MyBatis-Plus】一、快速入門

這里寫自定義目錄標題MyBatis-Plus 概述快速入門入門案例常用注解常見配置MyBatis-Plus 概述 MyBatis-Plus 簡介&#xff1a; MyBatis-Plus 是在 MyBatis 基礎上開發的一個 增強工具包&#xff0c;它簡化了 MyBatis 的開發&#xff0c;減少了大量重復代碼。它保持了 MyBatis …

PostgreSQL導入mimic4

一、PostgreSQL連接驗證 正確連接命令 使用psql工具連接目標數據庫&#xff0c;格式為&#xff1a;psql -h 127.0.0.1 -U 用戶名 -d 數據庫名 --password 示例&#xff08;用戶名Shinelon&#xff0c;數據庫mimic&#xff09;&#xff1a;psql -h 127.0.0.1 -U Shinelon -d mi…

css中 hsl() 的用法

好的 &#x1f44d; 我來詳細介紹一下 CSS hsl() 的用法。1. 基本語法 color: hsl(hue, saturation, lightness);hue&#xff08;色相&#xff09; 取值范圍&#xff1a;0 ~ 360&#xff08;角度值&#xff0c;代表色環的角度&#xff09;0 或 360 → 紅色120 → 綠色240 → 藍…

企業級Spring事務管理:從單體應用到微服務分布式事務完整方案

企業級Spring事務管理&#xff1a;從單體應用到微服務分布式事務完整方案 &#x1f31f; 你好&#xff0c;我是 勵志成為糕手 &#xff01; &#x1f30c; 在代碼的宇宙中&#xff0c;我是那個追逐優雅與性能的星際旅人。 ? 每一行代碼都是我種下的星光&#xff0c;在邏輯的土…

繼續記錄面試題

坐在工位&#xff0c;沒事干心慌的不行&#xff0c;可能也是房貸壓的。一閑下來就開始胡思亂想&#xff0c;無法沉下心去背那些八股文。這才剛剛接到離職通知第三天啊。而且、我還在坐班呢&#xff01;&#xff01;&#xff01; 哎、怪不得有句老話說的&#xff0c;人窮志短&a…

從零開始學習:深度學習(基礎入門版)(第2天)

&#xff08;一&#xff09;在pycharm軟件中&#xff0c;用python語言&#xff0c;opencv庫實現以下功能(1.1)圖片的邊界填充核心流程&#xff1a;讀取原始圖像使用 cv2.imread() 加載名為 yueshan.png 的圖像文件統一邊界參數設定四周留白尺寸均為 50px&#xff08;上下左右各…

HTTP協議-3-HTTP/2是如何維持長連接的?

先說結論&#xff1a;HTTP/2的“長連接” 一個TCP連接 多路復用 二進制幀 流控制 持久會話管理 它不只是“連接不斷”&#xff0c;更關鍵的是&#xff1a;在這個長連接上&#xff0c;可以同時并發傳輸成百上千個請求和響應&#xff0c;互不阻塞&#xff01; 1、HTTP/2的“…

圖解希爾排序C語言實現

1 希爾排序 希爾排序&#xff08;Shell Sort&#xff09;是D.L.Shell于1959年提出來的一種排序算法&#xff0c;在這之前排序算法的時間復雜度基本都是O(n)&#xff0c;希爾排序算法是突破這個時間復雜度的第一批算法之一。 1.1 基本概念與原理 希爾排序通過將原始列表分割成若…

網絡協議——HTTPS協議

目錄 一、HTTPS是什么 加密是什么 二、HTTPS的工作過程 &#xff08;一&#xff09;對稱加密 &#xff08;二&#xff09;非對稱加密 &#xff08;三&#xff09;在非對稱加密的基礎上&#xff0c;引入證書校驗 證書是什么 證書的內容 用證書解決中間人攻擊 三、總結 …

React 基礎實戰:從組件到案例全解析

React 基礎實戰專欄:從組件到案例全解析 本專欄圍繞 React 核心概念(組件、Props、State、生命周期)展開,通過 6個實戰案例+核心知識點拆解,幫你掌握 React 基礎開發邏輯,每篇聚焦1個實戰場景,搭配完整代碼與原理講解,適合 React 入門者鞏固基礎。 專欄目錄 【組件傳…

ARM芯片架構之CoreSight Channel Interface 介紹

CoreSight Channel Interface&#xff08;通道接口&#xff09;詳解1. 概述 Channel Interface 是 ARM CoreSight 架構中用于在不同組件之間傳遞觸發事件的專用接口。它是 Event Interface 的增強版本&#xff0c;支持多通道、雙向通信&#xff0c;以及同步與異步兩種時鐘域連接…

Blender模擬結構光3D Scanner(二)投影儀內參數匹配

關于投影儀外參的設置可參見前一篇文章 Blender模擬結構光3D Scanner&#xff08;一&#xff09;外參數匹配-CSDN博客 使用Projectors插件模擬投影儀 Step 1 在Github下載插件&#xff08;https://github.com/Ocupe/Projectors&#xff09;。下載zip壓縮包即可&#xff0c;無…

synchronized的作用

目錄 一、核心作用 二、實現原理&#xff1a;基于"對象鎖" 三、使用方式 四、鎖的優化 五、優缺點 六、總結 synchronized 是 Java 中用于解決多線程并發安全問題的核心關鍵字&#xff0c;它的主要作用是實現線程間的同步&#xff0c;確保多個線程在訪問共享資…

機試備考筆記 14/31

2025年8月14日 小結&#xff1a;&#xff08;17號整理14號的筆記&#xff0c;這輩子真是有了w(&#xff9f;Д&#xff9f;)w&#xff09;昨天摔了跤大的&#xff0c;今天好媽媽在家&#xff0c;松弛。省流&#xff1a;6道中等&#xff0c;明天只學了10分鐘嘻嘻 目錄LeetCode22…

dolphinscheduler中任務輸出變量的問題出現ArrayIndexOutOfBoundsException

一段腳本任務如下&#xff1a;ret/data/dolphinscheduler/loadOraTable.sh "yonbip/yonbip10.16.10.69:1521/orcl" "select t.bondcontractno,t.olcunissuemny from yonbip.bond_contract t " "/dmp/biz" "bip" "2025-08-13"…

OpenCv(二)——邊界填充、閾值處理

目錄 一、邊界填充&#xff08;Border Padding&#xff09; 1. 常見填充類型及效果 2.代碼示例 &#xff08;1&#xff09;constant邊界填充&#xff0c;填充指定寬度的像素 &#xff08;2&#xff09;REFLECT鏡像邊界填充 &#xff08;3&#xff09;REFLECT_101鏡像邊界…

Leetcode 15 java

今天復習一下翻轉二叉樹 226. 翻轉二叉樹 給你一棵二叉樹的根節點 root &#xff0c;翻轉這棵二叉樹&#xff0c;并返回其根節點。 示例 1&#xff1a; 輸入&#xff1a;root [4,2,7,1,3,6,9] 輸出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 輸入&#xff1a;root [2…