Python中變量和數(shù)據(jù)類型的使用方法和避坑指南
前言
上周面試,面試官問了一個問題:
a = [1, 2, 3] b = a b.append(4) print(a) # 輸出什么?
我當時就愣了——a 居然也被改了,輸出 [1, 2, 3, 4]!
后來才知道,Python 的變量不是"盒子裝數(shù)據(jù)",而是"標簽貼數(shù)據(jù)"。a 和 b 貼的是同一個列表,改一個另一個也變。這個坑不搞清楚,后面寫代碼全是 bug。
今天把變量和數(shù)據(jù)類型徹底講明白,5個坑我都幫你踩過了。
一、變量:不是盒子,是標簽
1.1 變量到底是什么?
很多教程說"變量是裝數(shù)據(jù)的盒子",這個比喻在 Python 里不準確。
Python 的變量更像是一張便利貼——貼在數(shù)據(jù)上,而不是裝著數(shù)據(jù):
name = "張三" # 把"張三"這個便利貼貼在字符串上 age = 25 # 把"age"這個便利貼貼在整數(shù)25上 height = 1.75 # 貼在浮點數(shù)1.75上 is_student = True # 貼在布爾值True上
關(guān)鍵區(qū)別:
# "盒子"思維:a和b是兩個獨立的盒子 a = [1, 2, 3] b = a # 把a的內(nèi)容復制一份給b? b.append(4) print(a) # [1, 2, 3, 4] ← a也被改了! ? # "標簽"思維:a和b貼在同一個列表上 a = [1, 2, 3] b = a # b也貼到了同一個[1,2,3]上 b.append(4) # 改的是列表本身,a和b都能看到 print(a) # [1, 2, 3, 4] ← 合理!
坑1:變量是引用不是拷貝,賦值 b = a 不會創(chuàng)建新數(shù)據(jù),只是多貼了一個標簽。想真正拷貝用 b = a.copy() 或 b = a[:]。
1.2 變量命名規(guī)則
| 規(guī)則 | 正確示例 | 錯誤示例 | 原因 |
|---|---|---|---|
| 由字母、數(shù)字、下劃線組成 | user_name | user-name | - 不是合法字符 |
| 不能以數(shù)字開頭 | name2 | 2name | 數(shù)字開頭非法 |
| 不能使用保留關(guān)鍵字 | class_ | class | class 是關(guān)鍵字 |
| 區(qū)分大小寫 | Name ≠ name | — | Python 大小寫敏感 |
Python 官方 PEP8 規(guī)范推薦 snake_case(蛇形命名法) :
# ? 推薦 user_name = "張三" max_value = 100 is_valid = True ? # ? 不推薦(駝峰命名在Python中不常見,通常只用于類名) userName = "張三" MaxValue = 100
1.3 動態(tài)類型:同一個變量能裝不同類型
x = 10 # int print(type(x)) # <class 'int'> ? x = "hello" # 變成 str 了 print(type(x)) # <class 'str'> ? x = [1, 2, 3] # 又變成 list print(type(x)) # <class 'list'>
這在 Java/C++ 里不可能——變量聲明了 int 就永遠是 int。Python 隨時能換,靈活但也容易出 bug。
建議:雖然 Python 允許變量類型變化,但盡量保持變量用途一致,別一個變量一會兒是數(shù)字一會兒是字符串,自己都看不懂。
二、5個基本數(shù)據(jù)類型
2.1 整數(shù) int
整數(shù)就是沒有小數(shù)點的數(shù)字,Python 中沒有長度限制(取決于內(nèi)存):
a = 100 # 十進制 b = 0b1100100 # 二進制(前綴 0b) c = 0o144 # 八進制(前綴 0o) d = 0x64 # 十六進制(前綴 0x) ? print(a, b, c, d) # 全部輸出:100 ? # 大數(shù)字可以用下劃線分隔,便于閱讀 big_num = 1_000_000_000 print(big_num) # 1000000000 ? # 進制轉(zhuǎn)換 print(bin(255)) # 0b11111111 print(oct(255)) # 0o377 print(hex(255)) # 0xff
2.2 浮點數(shù) float
帶小數(shù)點的數(shù)字,用于需要精度的場景。
坑2:0.1 + 0.2 ≠ 0.3,這是所有編程語言的通病,不只是 Python:
a = 0.1 + 0.2
print(a) # 0.30000000000000004 ← 不是0.3!
?
# 涉及錢的計算,一定要用 decimal
from decimal import Decimal
result = Decimal('0.1') + Decimal('0.2')
print(result) # 0.3 ?
血淚教訓:做金融類項目時,我因為用了 float 算金額,對賬差了0.01元,排查了一整天。涉及錢,一律用 Decimal。
2.3 布爾值 bool
只有 True 和 False(首字母大寫,別寫 true)。
坑3:哪些值是 False?很多人答不全
# 這些都是 False("假"值/空值)
bool(0) # False
bool(0.0) # False
bool("") # False(空字符串)
bool([]) # False(空列表)
bool({}) # False(空字典)
bool(None) # False
?
# 其余都是 True
bool(1) # True
bool("abc") # True
bool([0]) # True(列表不為空,哪怕里面是0)
bool(-1) # True(負數(shù)也是True)
面試常考: "Python中哪些值是假值?" 記住口訣——零、空、None 就是假。
2.4 字符串 str
用單引號或雙引號包裹的文本:
name = "張三"
address = '北京市朝陽區(qū)'
?
# 三引號:多行字符串
poem = """
床前明月光,
疑是地上霜。
舉頭望明月,
低頭思故鄉(xiāng)。
"""
?
# 原始字符串(轉(zhuǎn)義字符不生效,Windows路徑必備)
path = r"C:\new folder\file.txt"
# 不加r的話,\n會被當成換行符!
?
# 字符串拼接
print("Hello" + " " + "World") # Hello World
print("Ha" * 3) # HaHaHa
2.5 None
None 表示"什么都沒有",不是0,不是空字符串,不是False。
result = None print(result is None) # True ? # 區(qū)分 None 和空值 empty_list = [] print(empty_list is None) # False!空列表不是None print(len(empty_list) == 0) # True,這才是判斷空列表的正確方式
坑4:判斷空值用 is None,不要用 == None,雖然結(jié)果一樣但 is 才是 Python 規(guī)范。判斷空列表/空字符串用 len(x) == 0 或直接 if not x:。
三、類型查看與轉(zhuǎn)換
3.1 type() 和 isinstance()
x = 42 print(type(x)) # <class 'int'> ? # isinstance 判斷類型(推薦,考慮繼承關(guān)系) print(isinstance(x, int)) # True print(isinstance(x, (int, float))) # True(int或float都行)
type() vs isinstance() 的區(qū)別:
class Animal:
pass
?
class Dog(Animal):
pass
?
d = Dog()
print(type(d) == Animal) # False(type不認繼承)
print(isinstance(d, Animal)) # True(isinstance認繼承)
實際開發(fā)中 優(yōu)先用 isinstance() ,更安全。
3.2 類型轉(zhuǎn)換
# 轉(zhuǎn)整數(shù)
int(3.14) # 3(截斷,不四舍五入)
int("42") # 42
?
# 轉(zhuǎn)浮點數(shù)
float(3) # 3.0
float("3.14") # 3.14
?
# 轉(zhuǎn)字符串
str(42) # "42"
str(3.14) # "3.14"
?
# 轉(zhuǎn)布爾值
bool(0) # False
bool("") # False
bool("abc") # True
坑5:字符串轉(zhuǎn)數(shù)字會報錯
int("abc") # ValueError! 程序直接崩了
?
# 安全轉(zhuǎn)換方法
def safe_int(s, default=0):
try:
return int(s)
except ValueError:
return default
?
print(safe_int("100")) # 100
print(safe_int("abc")) # 0(不會崩)
實際開發(fā)中,凡是接收用戶輸入轉(zhuǎn)數(shù)字的,都要做異常處理。
四、== 和 is 的區(qū)別(面試必考)
這個問題面試被問到的概率極高:
a = [1, 2, 3] b = [1, 2, 3] ? print(a == b) # True,值相等 print(a is b) # False,不是同一個對象(內(nèi)存地址不同) ? c = a print(a is c) # True,是同一個對象
一句話記?。?code>== 比較值,is 比較身份(是不是同一個對象)。
還有個小整數(shù)池的坑:
x = 256 y = 256 print(x is y) # True(-5到256會被緩存,同一對象) ? x = 257 y = 257 print(x is y) # False(超出緩存范圍,不同對象)
面試官最愛問這個,記住 -5到256是小整數(shù)池的范圍就行。
五、實戰(zhàn):登錄驗證系統(tǒng)
把上面學的布爾值、字符串、類型轉(zhuǎn)換串起來:
"""用戶登錄驗證 - 演示變量與數(shù)據(jù)類型的綜合使用"""
?
def validate_login(username, password):
"""驗證登錄信息"""
valid_users = {
"admin": "123456",
"user1": "password",
"test": "test123"
}
?
if not username: # 空字符串是假值
return False, "用戶名不能為空"
if username not in valid_users:
return False, "用戶不存在"
if valid_users[username] != password:
return False, "密碼錯誤"
?
return True, "登錄成功"
?
# 測試
test_cases = [
("admin", "123456"), # 正確
("admin", "wrong"), # 密碼錯誤
("unknown", "123"), # 用戶不存在
("", "123"), # 空用戶名
]
?
for username, password in test_cases:
success, message = validate_login(username, password)
status = "?" if success else "?"
print(f"{status} {username or '(空)'}: {message}")
運行結(jié)果:
? admin: 登錄成功
? admin: 密碼錯誤
? unknown: 用戶不存在
? (空): 用戶名不能為空
注意 not username 這里用了布爾值的特性——空字符串是假值,直接 if not username 就能判斷空,不用寫 if username == ""。這就是理解數(shù)據(jù)類型帶來的簡潔。
總結(jié):5個坑一句話回顧
| 坑 | 一句話 | 避坑方法 |
|---|---|---|
| 坑1:變量是引用 | b = a 不會拷貝數(shù)據(jù) | 用 .copy() 或 [:] |
| 坑2:浮點數(shù)精度 | 0.1+0.2≠0.3 | 涉及錢用 Decimal |
| 坑3:哪些是假值 | 零、空、None 就是假 | 記住口訣就行 |
| 坑4:判斷空值 | == None 不規(guī)范 | 用 is None 或 if not x: |
| 坑5:字符串轉(zhuǎn)數(shù)字 | int("abc") 直接崩 | try/except 包一下 |
到此這篇關(guān)于Python中變量和數(shù)據(jù)類型的使用方法和避坑指南的文章就介紹到這了,更多相關(guān)Python變量和數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyCharm 2020.1版安裝破解注冊碼永久激活(激活到2089年)
這篇文章主要介紹了PyCharm 2020.1版安裝破解注冊碼永久激活(激活到2089年),需要的朋友可以參考下2020-09-09
淺談pymysql查詢語句中帶有in時傳遞參數(shù)的問題
這篇文章主要介紹了淺談pymysql查詢語句中帶有in時傳遞參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

