1. 程式人生 > 其它 >python基礎---列表與字串的記憶體指向問題

python基礎---列表與字串的記憶體指向問題

技術標籤:python

對於如下程式碼:

x = "a"
y = "a"
print(x is y)
z = [1, 2, 3]
w = [1, 2, 3]
print(z is w)

輸出結果為
True
False

按理說x與y時一樣的,x=y是沒問題的,z,w也一樣的資料但是結果卻是false,這是為什麼呢?
這就要根據物件來說明了,x和y都是字串,他預設是一個不可變的物件,因此他們指向的是同一個元素地址,但是列表時可變的,雖然z,w的資料一樣,但是他們時分別來開闢記憶體,他指向的地址是不一樣的,因此時false。
對於列表會有建立方法,第一種是迴圈方式,第二種時直接建立,但是,這兩種的記憶體指向時不同的。

A = [0, 0, 0]
for i in range(3):
    A[i] = [0] * 3
print(A)

B = [[0]*3]*3
print(B)

記憶體指向如下所示:
在這裡插入圖片描述
這裡可以看到A的記憶體指向時相互獨立的,但是對於第二種方法他是指向第一個物件的。於是有了以下的情況:

B[0][0] = 1
print(B)

輸出:
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
同樣:

print(B[0] is B[1])

輸出為:true
可以驗證上述B的記憶體指向

而對於A這個巢狀列表,同樣方法進行測試:

A[0][0] = 1
print(A)
print(A[0] is A[1
])

輸出結果為:

[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
False

由此可以驗證圖所指向的記憶體結構

當然,對於單純的數值判斷可以直接用==來進行

print(B[0] == B[1])
print(A[1] == A[2])

輸出:
True
True