引用
概念
- **變量 和 數(shù)據(jù) **都是保存在內(nèi)存中的
- 在 Python 中,函數(shù) 的參數(shù)傳遞和返回值 都是靠 引用 傳遞的
- **變量 **和 數(shù)據(jù)是分開存儲的
- 數(shù)據(jù) 保存在內(nèi)存中的一個位置
- 變量 中記錄數(shù)據(jù)的地址,就叫 引用
- 使用** id() ** 函數(shù)可以查看變量中保存數(shù)據(jù)所在的 內(nèi)存地址
注: 如果變量已經(jīng)被定義,當(dāng)給一個變更 重新賦值的時候,本質(zhì)上是 修改了數(shù)據(jù)的引用
**示例
**
a=1
print(id(a))
print(id(1))
b=a
print(id(b))
a=2
print(id(a))
輸出結(jié)果:從這里面可以看出 前三個的內(nèi)存地址是一樣的
**函數(shù)的參數(shù)傳遞與返回值的引用
**
def test(num):
print("傳遞的值是:%d,內(nèi)存地址是:%d" %(num,id(num)))
result="test"
print("返回的值是:%s,內(nèi)存地址是:%d" %(result,id(result)))
return result
a=1
print("需要傳遞的參數(shù)的值是:%d,內(nèi)存地址是:%d"%(a,id(a)))
ss=test(a)
print("調(diào)用函數(shù)獲取的返回值是:%s,內(nèi)存地址是:%d" %(ss,id(ss)))
**輸出結(jié)果
**
結(jié)論:從結(jié)果中可得知,在調(diào)用函數(shù)時,傳入的變量,實際上是將變量的引用內(nèi)存地址 傳遞進(jìn)去了。函數(shù)在返回時,同樣是將變量對應(yīng)的 引用 返回出來了
可變和不可變類型
- 不可變類型,即內(nèi)存中的數(shù)據(jù)不允許被修改
- 數(shù)字類型:int 、bool、float、complex、long
- 字符串 str
- 元組 tuple
- 可變類型,即內(nèi)存中的數(shù)據(jù)可以被修改
- 列表 list
- 字典 dict
- 集合 set
示例
# 不可變數(shù)據(jù)類型
a=1
print("內(nèi)存地址是:%d" %id(a))
a=2
print("內(nèi)存地址是:%d" %id(a))
#可變數(shù)據(jù)類型
b=[1,2,3]
print("內(nèi)存地址是:%d" %id(b))
b.append(4)
print("值是:%s,內(nèi)存地址是:%d" %(b,id(b)))
#如果重新用 = 賦值,則會新建一塊內(nèi)存地址
b=[]
print("新內(nèi)存地址是:%d" %id(b))
輸出結(jié)果
結(jié)論:
- 可變類型的數(shù)據(jù)變化,是通過方法來 實現(xiàn)的
- 如果給一個可變類型的變量,賦值了一個新的數(shù)據(jù),引用的地址則會不同
**哈希(hash)
**
- Python 中內(nèi)置有一個名字叫做 hash() 的函數(shù)
- 接收一個 不可變類型 的數(shù)據(jù)作為參數(shù)
- 返回 結(jié)果是一個整數(shù)
- 哈希是一種算法,其作用就是提取數(shù)據(jù)的特征碼(類似指紋)
- 相同的內(nèi)容 得到 相同的結(jié)果
- 不同的內(nèi)容 得到 不同的結(jié)果
- 在 Python 中,設(shè)置字典的鍵值對時,會首先對 key 進(jìn)行 hash ,用來決定如何在內(nèi)存中保存字典的數(shù)據(jù),以方便 后續(xù) 對字典的操作:增、刪、改、查
- 鍵值對的 key 必須是不可變類型的數(shù)據(jù)
- 鍵值對的 value 可以是任意類型的數(shù)據(jù)
# 對同一個不可變的數(shù)據(jù)類型,hash 兩次,得到的結(jié)果是一樣的
print(hash("123"))
print(hash("123"))
輸出結(jié)果
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62968 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28465 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
85037
發(fā)布評論請先 登錄
相關(guān)推薦
評論