這個問題在這里已經有了答案: 如何克隆串列以使其在分配后不會意外更改? (23 個回答) 22 小時前關閉。
def append_arr(arr):
t_arr = arr
print('arr before',arr)
t_arr.extend(arr)
print('arr affter',arr)
arr = ['a','b','c']
append_arr(arr)
我有串列a,分配b = a,并通過函式更改串列b(追加,插入,擴展)我不再觸摸串列a,但是當b改變時,a也跟著b改變。
如何通過(追加、插入、擴展)來更改 b 和不更改
def test():
arr_m = ['a','b','c']
print('arr_m before', arr_m)
append_arr(arr_m)
print('arr_m affter', arr_m)
test()
arr_m before ['a', 'b', 'c']
arr before ['a', 'b', 'c']
arr affter ['a', 'b', 'c', 'a', 'b', 'c']
arr_m affter ['a', 'b', 'c', 'a', 'b', 'c']
我不知道為什么 arr_m 也會改變
uj5u.com熱心網友回復:
您期望t_arr = arr創建一個具有相同內容的新串列,但它所做的只是創建一個參考相同串列的第二個名稱。
它是這樣作業的,因為:
許多編程語言都是根據計算機的作業方式設計的。將串列視為事物是正常的,但在計算機的底層,串列更像是一個地方——記憶體中存盤所有串列內容的位置。直到今天,許多程式員都習慣于“面向位置的編程”(盡管幾乎沒有人這么稱呼它,而且它還不是一個廣泛使用的視角),而 Python 是在 1991 年左右撰寫的。
直到最近,所有東西都是不可變的,或者默認情況下賦值進行復制的語言通常效率低得多 - 需要一些棘手的優化才能將語意上總是復制的代碼轉換為僅在以下情況下復制最少資料的機器操作他們需要。因此,當 Python 還是新的時候,如果它一直被設計為復制,它會慢很多,并且會使用更多的記憶體。
程式員文化還沒有完全理解“價值觀的價值”(Rich Hickey 的精彩視頻,Clojure 語言的創造者,與 Python 不同,它的行為方式不是這樣- 所以我們仍然有很多面向地方的分享-mutable-state-by-default 語言被廣泛使用,大多數人并不認為這是一個大問題或主要問題。
但是現在您可能會想“但是為什么整數和字串不會發生這種情況!?” 你是對的,如果你這樣做了str_t = strthen str_t = str,它就會像你期望的串列一樣作業。那是因為:
整數在歷史上是一種特殊情況,因為它們在計算機中是如此之小,并且對計算機操作如此重要,以至于它通常更有效,或者在任何情況下都足夠有效,以將它們實作為不可變的值。
x = 0; y = x; x = 1但也許人們也更容易直觀地理解,如果把零y也變成一,那就太瘋狂了。字串被故意設為不可變,即使它們基本上是串列,因為在 Python 被創建的時候,編程世界已經看到了很多陷阱(以及新程式員的類似反應)字串是可變的,以至于“字串應該是不可變”成功地克服了可變狀態的傳統,特別是對于像 Python 這樣旨在對人類更友好的語言,盡管有記憶體和速度成本。
鏈接的重復問題將向您展示如何讓它做您想做的事情,并有一些其他體面的詳細說明為什么它會以這種方式作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/527074.html
標籤:python-3.x列表
下一篇:Python-增加兩個串列的組合
