簡體   English   中英

整數和對python列表切片的引用

[英]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更改列表ab[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的索引01處修改值。 因此,索引23原始值保持不變。

>>> b = a[0:2]  
>>> b[0:2] = 33,44  
>>> b  
[33, 44]  
>>> a  
[11, 22, 3, 4]  

您已將索引01處的值從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 即, ab都指向同一列表。 b所做的任何更改也會影響a 可以使用id函數進行驗證。 相同的id值表示兩者都指向同一對象。

>>> c = a[:]
>>> print(c)
[1, 8, 3, 4]
>>> id(a)
46734952
>>> id(c)
46563240  

在上述情況下,將a切片分配給c 因此,將制作一個副本並將其分配給c 因此, acid值是不同的。

因為有兩種類型的數據

  1. 可變數據類型

    • 清單
    • 字典
  2. 不變的數據類型

    • 數字(布爾,整數,浮點數和復數)
    • 元組
    • 冰封

更改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

現在,我們將指定的片ab 與您的示例相反,當列表包含數字值時,此處包含引用,因此可以說它們是相同的:

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.

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