簡體   English   中英

Python:理解引用

[英]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.basebc.base.basea 在numpy 1.7中, c.basea

你混淆了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM