我來自 R 并試圖更好地掌握可變性。下面是代碼,我認為我理解的前兩部分(見評論)。第三部分沒看懂。
#1. Refering to same instance with two variable names
listOrig = [i for i in range(1001, 1011)]
listCopy = listOrig
listOrig[0]=999
listOrig == listCopy #Returns True, because both variable names actually refer
#to the same instance, ergo still containing the same values
listOrig[0] is listCopy[0] #Same instance 999, the id is also the same as a
#consequence
#2. Refering to same part of original list through slicing
listSlice = listOrig[0:5]
listOrig[0] is listSlice[0] #Returns True, analogous to above
a = 999
listOrig[0] == a #True because it's the same value or number
listOrig[0] is a #False because they are different instances with different IDs
#3. WHAT I DO NOT UNDERSTAND: changing the sliced copy does not affect the original list
listOrig
listSlice
listSlice[0] = 1001
listOrig[0] is listSlice[0] #Different number, thus also obviously different ID
uj5u.com熱心網友回復:
我將發布答案只是因為我認為用圖表更好地解釋了這一點。
假設您創建了一個list_1包含數字 1、2 和 3的串列。
list_1 = [1,2,3]

然后將串列分配給一個新變數。
list_2 = list_1
它是對同一原始串列的另一個參考。

或者,假設您從串列中取出一部分。
list_3 = list_1[:]
它是一個參考相同物件的新串列。

因此,如果您重新分配新串列中的元素,則不會影響原始串列。
list_3[0] = 4

uj5u.com熱心網友回復:
正如評論中所說,切片是原始串列的副本。它當前(當值相同時)指的是相同的記憶體地址,因此 id(例如 id-function)是相同的并且listOrig[0] is listCopy[0]是 True。
下面的例子說明了這一點:即使你將兩個不同的整數變數 b 和 c 設定為相同的值,它們的 id 也是相同的。但是,如果更改 b 的值,則 c 的值不會更改。您還可以print(id(listSlice), id(listOrig[0:5]))從您的示例中檢查,該示例顯示切片變數和原始切片的 ID 不同
a = 1
b = 2
c = 2
print(id(a))
print(id(b))
print(id(c))
print(b is c)
輸出將是例如
2770111129904
2770111129936
2770111129936
True
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/371026.html
