[英]Why does python list slicing allow for referencing entries that aren't there?
[英]Integer and referencing on python list slicing
誰能解釋以下列表參考問題? 我不清楚。
例如 :
>>> a = [1,2,3,4]
>>> a[0:2] = 11,22
>>> a
[11, 22, 3, 4]
>>> b = a[0:2]
>>> b[0:2] = 33,44
>>> b
[33, 44]
>>> a
[11, 22, 3, 4]
為什么a[0:2] = 11,22
更改列表a
而b[0:2] = 33,44
沒有更改列表? b
不是引用a[0:2]
嗎? 為什么列表的引用會更改其值,但整數引用卻不會更改?
例:
>>> a = 1
>>> b = a
>>> a = 2
>>> b
1
我認為這是不言而喻的。
>>> a = [1,2,3,4]
>>> a[0:2] = 11,22
>>> a
[11, 22, 3, 4]
您正在a的索引0
和1
處修改值。 因此,索引2
和3
原始值保持不變。
>>> b = a[0:2]
>>> b[0:2] = 33,44
>>> b
[33, 44]
>>> a
[11, 22, 3, 4]
您已將索引0
和1
處的值從a
復制到b
,因此b
只有2個值。 然后,用[33,44]
覆蓋b
的值。 因此,您所觀察到的結果。
有些數據類型是不可變的(值不能更改),例如數字,字符串,元組。 dict,list等數據類型是可變的(值可以更改)
插圖
>>> a = [1,2,3,4]
>>> b = a
>>> id(a)
46734952
>>> id(b)
46734952
>>> b[1] = 8
>>> print(b)
[1, 8, 3, 4]
>>> print(a)
[1, 8, 3, 4]
在上述情況下, b
是一個參考a
。 即, a
和b
都指向同一列表。 對b
所做的任何更改也會影響a
。 可以使用id
函數進行驗證。 相同的id
值表示兩者都指向同一對象。
>>> c = a[:]
>>> print(c)
[1, 8, 3, 4]
>>> id(a)
46734952
>>> id(c)
46563240
在上述情況下,將a
切片分配給c
。 因此,將制作一個副本並將其分配給c
。 因此, a
和c
的id
值是不同的。
因為有兩種類型的數據
可變數據類型
不變的數據類型
更改mutable type
將更改它的對象;當更改immutable type
時,將創建新的對象,然后將其分配給變量
我將逐步回答:
a[0:2] = 11,22
與執行a[0] = 11; a[1] = 22
a[0] = 11; a[1] = 22
。 這是常規任務,在這里不足為奇。 當您這樣做時:
b = a[0:2]
您會得到列表的淺表副本 。 這意味着您將獲得一個新列表,其中包含對每個對象的引用。 由於在您的情況下,列表中填充有int
,因此它實際上也是一個副本。 但是,請考慮以下示例:
讓我們定義一個類,它包裝一個int
(或任何其他數據類型,它是python :)),但是是可變的。
In [41]: class num(object):
...: def __init__(self, x):
...: self.x = x
...:
現在,僅在我們的課程中定義a
In [42]: a = [num(x) for x in range(1,5)]
In [43]: a[0].x
Out[43]: 1
In [44]: a[1].x
Out[44]: 2
現在,我們將指定的片a
成b
。 與您的示例相反,當列表包含數字值時,此處包含引用,因此可以說它們是相同的:
In [45]: b = a[0:2]
In [46]: b[0].x
Out[46]: 1
In [47]: b[1].x
Out[47]: 2
因此,當我在b
更改一個時:
In [48]: b[0].x = 3
它反映了a
:
In [50]: a[0].x
Out[50]: 3
但這是一個不同的列表。 因此,將新實例分配給列表中的位置...
In [49]: b[1] = num(20)
...是不是體現在a
:
In [51]: a[1].x
Out[51]: 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.