在python的資料型別中,有用可變和不可變的兩種型別,那下面就來看一看兩種資料型別有什麼區別
old_var = ['hello']
print(old_var)
>>> ['hello']
new_var = old_var
new_var += ['world']
print(old_var)
>>> ['hello', 'world']
這符合我們的邏輯嗎?是不是應該是這樣的輸出?
old_var = ['hello']
new_var = old_var
new_var += ['world']
print(old_var)
print(new_var)
>>> ['hello']
>>> ['hello', 'world']
事實卻是如此,因為列表在python中是可變資料型別,具有可變性。當你把乙個變數賦值為另乙個可變資料型別的變數的時候,此時對該可變資料型別中的資料做任意的改動會同步到上面的兩個變數中。新變數不過只是舊變數的乙個新名字而已。二者共用一片記憶體位址
print(id(old_var))
print(id(new_var))
>>>140704720957920
>>>140704720957920
下面看乙個簡單明瞭的例子
def add_num(num, default_list=):
print(default_list)
add_num(1)
add_num(2)
add_num(3)
>>>[1]
>>>[1, 2]
>>>[1, 2, 3]
不是想象中的樣子?想象中是不是應該
add_num(1)
add_num(2)
add_num(3)
>>>[1]
>>>[2]
>>>[3]
這就是可變資料型別的功能。在python中當函式被定義時,預設引數只會運算⼀次,⽽不是每次被調⽤時都會重新運算。永遠不要定義可變型別的預設引數,除⾮你知道你正在做什麼。你應該像這樣做
def add_num(num, default_list=none):
if default_list is none:
default_list =
print(default_list)
add_num(1)
add_num(2)
add_num(3)
>>>[1]
>>>[2]
>>>[3]
這樣每當你在調⽤這個函式不傳⼊default_list引數的時候,⼀個新的列表會被建立。所以每次呼叫的時候都會建立出乙個新列表,而不是上面那種樣子。 python可變與不可變
可變與不可變型別的實質實際上就是儲存機制的不同 不可變型別 比如字串 被稱為不可變的字串行,每個字元底層均有規範的unicode碼對應,記憶體規定無法對單一的乙個字元進行修改,要修改字串必須重新指向乙個全新的字串 可變型別 一方面,該列表可以保證在位址不變的前提下,改變列表內容 另一方面,該引用也可...
python可變與不可變
不可變作用和意義 物件所指的記憶體中的值是可以改變的。變數名儲存的是乙個位址,該位址指向乙個具體的物件,並且不管對變數的值進行怎樣的操作,都不會改變變數名的儲存位址。字典dict 列表list 集合set 1.list list1 1 2,3 4 print list1,id list1 1,2,3...
python中 可變與不可變物件
先看 python 1 2 3 4 a 1 def fun a a 2 printa 1 python 1 2 3 4 b def fun b b.1 printb 1 上面兩個分別輸出的到底應該是哪乙個呢?這裡首先需要弄清楚的就是可變 mutable 物件與不可變物件 immutable 在pyt...