[英]Python: Making sense of references
我理解基本的python引用,比如a + = b和a = a + b之間的區別,但這讓我感到困惑。
import numpy as np
arr1 = np.arange(6).reshape(2,3)
arr2 = arr1[0]
arr2 is arr1[0] #returns False, when I expect True
arr1[0] = [7,8,9]
arr2 #[7,8,9], when I expect [0,1,2] since the 'is' returned False
這里發生了什么?
索引numpy數組時,會創建一個新視圖(它本身就是一個numpy數組)。 這是一個不同的對象,因此, is
失敗,但它是在同一塊誠實-實際上-上的硬件存儲器中的圖。 修改該視圖時,您可以修改可能存在其他視圖的內存位。
編輯:通過檢查數組的ctypes.data
屬性,您實際上可以看到與numpy數組關聯的內存的起始地址。
In [1]: import numpy as np
In [2]: arr1 = np.arange(6).reshape(2,3)
In [3]: arr2 = arr1[0]
In [4]: arr2.ctypes.data
Out[4]: 39390224
In [5]: arr1[0].ctypes.data
Out[5]: 39390224
相同!
如果需要檢查兩個numpy數組是否指向相同的數據,請使用base
屬性。 從你的例子:
>>> arr1 = np.arange(6).reshape(2,3)
>>> arr2 = arr1[0]
>>> arr1
array([[0, 1, 2],
[3, 4, 5]])
>>> arr1.base # arr1 is a view of the array before reshaping!
array([0, 1, 2, 3, 4, 5])
>>> arr2.base
array([[0, 1, 2],
[3, 4, 5]])
>>> arr2.base is arr1
True
從numpy 1.7 base
鑽頭開始一直到原始陣列。 從發行說明:
.base
上的.base
屬性,用於視圖以確保擁有內存的基礎數組不會過早釋放,現在當您擁有視圖視圖時會折疊引用。 例如::
a = np.arange(10)
b = a[1:]
c = b[1:]
在numpy 1.6中,
c.base
是b
,c.base.base
是a
。 在numpy 1.7中,c.base
是a
。
你混淆了is
, =
和==
運算符。
is
身份檢查。 使用它來查看兩個變量是否實際指向同一個對象而不只是具有相同的值 =
是賦值運算符。 它為變量(或切片,如您的情況) 分配值。 ==
是相等運算符。 它檢查兩個對象是否具有相同的語義值。 所以在你的情況下:
arr2 == arr[0] # now should return True
當您從數組中讀取值時,Numpy似乎會創建新對象。 因此,每次閱讀時,都會創建一個新對象。 所以兩次讀取產生不一樣的對象,所以is
給人False
的結果。
>>> arr1 = np.arange(6).reshape(2,3)
>>> arr1
array([[0, 1, 2],
[3, 4, 5]])
>>> arr2 = arr1[0]
>>> arr2
array([0, 1, 2])
所以是的, arr1[0]
和arr2
是相等的。 然而,
>>> arr2 is arr1[0]
False
因為它不是比較ndarrays的工具。 使用is
,檢查arr1[0]
和arr2
是否是同一個對象,而不是。 試試==
,你會得到
>>> arr2 == arr1[0]
array([ True, True, True], dtype=bool)
或者使用numpy.equal(t1,t2)
>>> np.equal(arr2, arr1[0])
array([ True, True, True], dtype=bool)
那么你想對你的相等測試有一個布爾答案,做
>>> (np.equal(arr2, arr1[0])).all()
True
'is'運算符比較兩個對象的身份; id()函數返回一個表示其身份的整數(當前實現為其地址)。
http://docs.python.org/2/reference/datamodel.html
舉個例子,
a = 1, b = 1
a is b
Out[26]:True
id(a)
Out[27]:37470472L
id(b)
Out[27]:37470472L
id(1)
Out[27]:37470472L
這三個人都有相同的身份。 但,
a = [1]
b = [1]
a is b
Out[26]:False
id(a)
Out[37]:142781064L
id(b)
Out[38]:142780616L
因此,數組中也會發生同樣的事情。 他們沒有相同的身份。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.