不可變物件:資料、字串、元組,即使有多個變數共享引用,也不會因為某乙個變數的改變而影響其他共享引用的變數的值(某個變數的改變直接使得該變數不再是之前物件的引用)
可變物件:列表、字典、集合,當有多個物件共享引用時,某乙個變數的改變(比如改變某項的值),會直接改變引用的物件的值,而該變數的引用未變
序列的操作:重複、合併、分片是直接將變數1的值拷貝給變數2,不存在共享引用(兩個變數的id不一樣,但是變數的對應的項的id是一樣的)
a = [1, , [3]]
print id(a)
print (id(a[0]),id(a[1]),id(a[2]))
#結果:
53665920
(47962712, 53687472, 53645600)
b = a[:]
print id(b)
print (id(b[0]),id(b[1]),id(b[2]))
#結果:
53666160
(47962712, 53687472, 53645600)
分析:1、a與b不共享引用
2、a[0]與b[0]共享引用
3、a[1]與b[1]共享引用,a[1]、b[1]是字典
4、a[2]與b[2]共享引用,a[2]、b[2]是列表
b[1][3]=33
#改變的字典內的某個項,共享引用的變數收到影響
b[2]=[4]
#改變的b[2]列表,b[2]列表的引用變了,a[2]列表的引用未變
b[0]=2
#改變的是b[0],b[0]的引用變了,a[0]的引用未變
print b
print (id(b[0]),id(b[1]),id(b[2]))
print a
print (id(a[0]),id(a[1]),id(a[2]))
#結果:
[2, , [4]]
(47962700, 53687472, 53667200)
[1, , [3]]
(47962712, 53687472, 53645600)
如何理解Python中的引用(一)
在 python 中,變數命令,引數傳遞,都是通過引用來實現。如果兩個變數為同乙個引用,那麼這兩個變數對應的資料一定相同 但是兩個對應的資料相同,引用不一定相同。從資料可變與不可變的型別來解析引用 可變資料型別 列表 字典 集合 通過容器的方法來修改其內容,位址不變 引用指向不會發生改變 通過重新賦...
Python中物件及引用的理解
def func ls return ls a func b func print a,b 考慮這段 的輸出,要理解python中物件及引用的概念。首先,在整個 中,a func 是func函式的第一次執行。在這次呼叫執行中,func函式的ls引數使用了預設值,也就是乙個空列表物件。呼叫結束後,這個...
引用傳遞理解
c 中說值傳遞,應用傳遞,物件傳遞我的理解一直有乙個誤區,最近犯了個低階的錯誤,記錄一下 1 class cla1 2 6 poco.teststaticchange poco poco.value after change va 7 poco.testchange poco poco.valeu ...