為什麼python中將列表1賦值給列表2後將列表2順序反轉也會影響列表1?

時間 2021-06-01 08:36:57

1樓:酒罈壇兒

python中的變數本質都是指標變數,儲存的是資料在記憶體中的位址。

所以你通過其中乙個變數對資料本身進行任何操作都會直接影響另乙個變數。

2樓:Gavin

其實問題的關鍵在於:

第一,賦值其實只是複製了物件的引用,並沒有建立新的物件第二,操作物件是乙個可變物件對於ls1 = [1,2,3,4,5]語句,首先Python會建立乙個物件[1,2,3,4,5],然後讓ls1指向該物件,給它貼上乙個名為ls1的便簽,如下圖。

對於ls2 = ls1語句,這是乙個賦值操作,並不會重新建立物件,而是複製了物件引用給ls2,讓ls2也指向剛才所建立的物件[1,2,3,4,5],也就是說現在ls1和ls2都是指向同一物件,如下圖所示。

對於ls2.reverse(),這是對列表進行翻轉,要知道列表是可變物件,是原地修改的,如下圖所示。

所以不管你是列印ls1還是ls2,其實都是列印同乙個物件。

以上,如果覺得我的回答對你有用,留下讚再走唄!嘿嘿!

3樓:「已登出」

事情是這樣的:計算機記憶體中有一塊資料,然後ls1找到了它並與它發生了聯絡,然後所謂ls1賦值ls2,其實就是讓ls2也與那塊資料發生了聯絡,所以ls1與ls2代表的都是同一塊資料,通過對其中乙個修改資料,其修改也將反映在另乙個上。

4樓:「已登出」

你可以把ls1看作乙個儲存資料的箱子,ls2看作另乙個箱子。ls2= ls1在python裡的意思是在ls2這個箱子設定乙個鏈結指引到ls1。當你對ls2進行操作時實際上是會通過這個鏈結找到ls1進行操作。

如果你只是想複製乙個和ls1一樣的列表用下面的方法:

ls2=ls1[:]

5樓:Z先生點記

1,在 python 中,所有變數都是引用的, 意味著列表1和列表2實際上指向了記憶體中的同一塊空間。如下,a_list 和 b_list的記憶體空間是相同的

2,Python 規定數值、元組、字串為不可變物件列表、字典為可變物件,可變物件與不可變物件的主要區別就是記憶體中的值是否可以被改變。也就是為什麼,列表在逆之後源列表也發生了改變;

下面寫出的兩個例子就是關於python的可變物件和不可變物件的應用可變物件(字典):

不可變物件(數值):

6樓:薄荷紅茶

在python中,任何變數存放的都是物件(真正資料)的引用(類似於C的指標,但還是有區別的),這也就是python叫動態語言的緣故之一。

賦值語句就是讓乙個變數指向乙個物件,而不是直接儲存本物件。即賦值語句讓變數存的是物件的位址,而不是物件本身。物件本身存在另乙個地方,你可以不用管。

然而,當你通過變數(引用)去改變物件時,卻是改變物件本身。改變物件的位址,其實沒啥意義,那就相當於指向乙個新的物件,原來的物件還是沒改。這一點跟指標是不一樣的。

所以呢,你賦值兩次,就相當於給資料【1,2,3,4,5】建立了兩個引用list1、list2,也就是讓兩個變數list1、list2都指向此資料物件。

等你通過list2改變物件時,由於list1也指向此物件,所以就如你看到的那樣了,list2改變,導致list1也變了。

不過如果你讓list1=【1,2,3,4,5】,list2=【1,2,3,4,5】時,就不會了,這也很好理解,相當於建立了兩個物件,只是值剛好相同。

為什麼這裡python列表的sort比c STL的sort排序還要快?

tearshark 因為你用的debug版在跑。I7 6600U 2.6GHz的CPU,資料從大到小排列,排序成從小到大 1000000,用時16ms。10000000,用時168ms。資料採用rand 函式隨機,排序成從小到大 1000000,用時74ms。10000000,用時648ms。con...

Python 為什麼下面這段程式只刪除1個0?

虛空混沌 Python用洛克的方法問題不大,其他語種,比如c 你可以從後向前迴圈 for i s.length 1 i 0 i 以前常這麼玩,體會一下 之前在工作裡也遇到了這個問題,樓上各位都說的很不錯。補充一點,字典其實也有類似的問題。不同的是,對於字典的迭代似乎會在每一次迭代結束之後檢查字典是不...

a len apple 1 什麼意思?Python?

達達 再說列表切片。1就是倒數第一的意思。如果a是乙個列表,那麼這個表示式的值為 a 4 a 3 a 2 a 1 當然,如果a是個字串,那表示式的值就是從倒數第四到倒數第一的所有字元組成的字串。 二貓子 1.首先a必然是乙個可以通過角標取值的物件,比如str,list,tuple等。2.是通過角標取...