網站首頁 編程語言 正文
前言
全可以訪問相同的對象, 因此我們講 這種變量名也叫對象的 "引用".
驗證1:
a = 2 b = 3 print(id(a),id(b)) ?#140734889681584 140734889681616 b = 2 print(id(b)) ? ?#140734889681584
驗證2:
b = 3 print(id(b)) ? ?#140734889681616 b +=1 print(id(b)) ? ?#140734889681648
相加其實是創建一個新的對象,然后把這個標簽b移到這個新的對象上
思考: 為什么Python的變量是這樣的? 和C/C++差異這么大捏?
- 空間考慮: 比如一個數字2, 在Python中只有這么一個數字2; 而一個C/C++程序中可能會有N個2.
-
時間考慮: 比如 a=b 這樣的賦值, 只是修改了一下貼標簽的位置, 不需要對對象進行深拷貝. 為什么Python可以這么做, 而C/C++不能這樣設計呢?
- C++中的賦值相當于深拷貝, a = 100 b = a ->內存中存放了兩份100
- java和python相當于淺拷貝 a = 100 b = a ->a和b都是100的引用,內存中只存放了一份100
Python的GC機制, 是這樣的設定的基礎.
理解對象和類型
關于不可變類型和可變類型
- python中的?
int
,str
,float
,tuple
其實是不可變類型的變量 (即:沒辦法修改一個已經存在的int類型的對象的值),只能創建新的,不能修改已經有的
s = "hehe" s[0] = 'a'; #error 報錯 TypeError: 'str' object does not support item assignment s = 'a'+s[1:] #只能重新創建 print(s) ? ?#aehe #原來的hehe對象已經銷毀,s貼在了aehe這個對象的身上
列表和字典都是可變對象:
- 有些對象是 "相似" 的, 于是我們把對象歸歸類. 比如把所有的整數歸為一類, 把所有的浮點數對象歸為一類,把所有的字符串歸為一類.
- 相同的類型的對象, 須有相同的操作. 比如, 所有的整數對象, 都可以進行加減乘除操作. 所有的字符串都可以使用切片操作.
關于動態靜態強弱類型
- Python是一種?動態強類型?編程語言.
- 動態是指運行時進行變量類型檢查; 強類型 指類型檢查嚴格, 并且"偏向于"不允許隱式轉換.
- 動態類型:一個變量在運行過程中類型發生變化
- 靜態類型:一個變量在運行過程中類型不能發生變化
- 強類型:越不支持隱式類型轉化,類型越強
- 弱類型:越支持隱式類型轉化,類型越弱
類似的, C語言是一種靜態弱類型語言. Java的類型檢查更為嚴格, 一般認為是靜態強類型, 而Javascript則是動態弱類型
如:
int a = 10; long b = 20; a = b ->C++可以 java不可
int a = 10; bool b = false; a = b ->C++可以,把false當成0 java不可
動態類型:小規模下更好,使用靈活
大規模常用靜態類型,否則多人協作容易有歧義
但是類型:越強越好
標準類型
- 整型
- 浮點型
注意:如果想要比較兩個浮點數是否相同,不能直接比較,因為會有精度損失,要做差比較
- 復數型
- 布爾型
- 字符串
- 列表
- 元組
- 字典
其它內建類型
- 類型
- NULL對象(None)
- 文件
- 函數
- 模塊
- 類
類型的類型
前面我們說, 類型也是對象
print(type(type(100))) #<class 'type'> ? print(id(type(100))) #140734889206240
None ->空類型
Python有一個特殊的類型, 稱為NoneType. 這個類型只有一個對象, 叫做None
print(type(None)) #<class 'NoneType'>
- NoneType類似于C語言中的void
- None類似于C語言的空指針NULL(NULL的含義:特指0號地址的內存)
- None這個對象沒啥有用的屬性, 它的布爾值為False
def func(): ? ?print("haha") ret = func() #打印haha 函數沒有返回值卻接收了,就是None print(ret) #打印None,
內建類型的布爾值
所有的標準對象, 均可以用于布爾測試(放到if條件中).
下列對象的布爾值是False:
- None
- False
- 所有值為0的數字(0, 0.0, 0.0 + 0.0j (復數))
- "" (空字符串)
- [] (空列表)
- () (空元組)
- {} (空字典)
if "": ? ?print("True") else: ? ?print("False") #打印:False
其他情況下, 這些內建對象的布爾值就是True.
原文鏈接:https://juejin.cn/post/7132270212530847774
相關推薦
- 2023-11-12 ubuntu18.04 開機后 USB 端口不能使用;臨時添加usb驅動導致鼠標鍵盤不可用ubunt
- 2022-05-01 Python的裝飾器詳情介紹_python
- 2022-05-12 Ubuntu 20.04開啟root用戶并恢復rc.local開機自啟
- 2023-03-26 python命令行參數argparse模塊基本用法詳解_python
- 2022-06-16 python遺傳算法之單/多目標規劃問題_python
- 2022-08-15 python中sort()和sorted()的區別及用法實例_python
- 2023-02-18 Framework中實現OC和Swift的混編方案_IOS
- 2023-01-18 Golang?sync.Map原理深入分析講解_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支