變數沒有型別,那麼就意味著它可以隨意指向任何物件。python中的變數相當於乙個指標。
當將乙個變數a
賦值給另乙個變數b
時,無論變數a
指向的是可變物件還是不可變物件,變數b
指向變數a
指向的物件。例:
>>
> alist =[1
,2,3
]>>
> anolist = alist
>>
>
id(alist)
==id
(anolist)
true
>>
> b =
4>>
> c = b
>>
>
id(b)
==id
(c)true
>>
> alist =
['a'
,'b'
,'c'
]>>
>
id(alist)
4419849608
>>
>
id(alist[1]
)4418477784
>>
> alist[1]
='x'
>>
>
id(alist)
4419849608
>>
>
id(alist[1]
)4417797008
>>
>
defmyfunc
(l):..
1)..
.print
(l)...
>>
> l =[1
,2,3
]>>
> myfunc(l)[1
,2,3
,1]>>
> l[1
,2,3
,1]
我們可以看到,可變物件作為引數傳入時,在函式中對其本身進行修改,是會影響到全域性中的這個變數值的,因為函式直接對該位址的值進行了修改。
>>
>
defmyfunc
(a):..
. a +=1.
..print
(a)...
>>
> a =
2>>
> myfunc(a)
3>>
> a
2
對於不可變物件來說,雖然函式中的a值變了,但是全域性中的a值沒變,因為函式中的a值已經對應了另外乙個位址,而全域性中的a值指向的原來位址的值是沒有變的。
例子:
>>
> l =[1
,2]>>
> m = l
>>
>
id(l)
4418649352
>>
> l = l +[3
,4]>>
>
id(l)
4419850056
>>
> l[1
,2,3
,4]>>
> m[1
,2]
>>
> l =[1
,2]>>
> m = l
>>
>
id(l)
4419849928
>>
> l +=[3
,4]>>
>
id(l)
4419849928
>>
> l[1
,2,3
,4]>>
> m[1
,2,3
,4]
可以看出第一種方法會新建物件,而+=
會在原物件記憶體塊末尾直接增加。
>>
> list_a =
>>
>
deffun_a()
:... list_a =[1
]...
>>
> fun_a(
)>>
> list_a
>>
> list_b =
>>
>
deffun_b()
:..1
)...
>>
> fun_b(
)>>
> list_b[1
]
解釋:
fun_a()
中使用了=
, 會建立乙個名為list_a
的區域性變數,所以在函式內部就不會訪問全域性變數list_a
了。
函式預設引數一定要設定為不可變引數,否則會引發一些錯誤,我們來看下面乙個例子:
>>
>
defmyfunc
(l=)
:..'add').
..print
(l)...
>>
> myfunc([1
,2,3
])[1
,2,3
,'add'
]>>
> myfunc(
['a'
,'b'])
['a'
,'b'
,'add'
]
上面**是正常執行的,我們來看下面這些
>>
> myfunc()[
'add'
]>>
> myfunc()[
'add'
,'add'
]>>
> myfunc()[
'add'
,'add'
,'add'
]
按理說應該每次都是['add']
,但是現在出現了意想不到的錯誤。
這是因為l =
是在函式定義時就確定下來的了,所以之後每次呼叫這個函式,使用的l都是同乙個,如果不指定這個引數的新值,就會出現上面這個問題。
上面這個l
可以預設設定為none
,這就是乙個不可變物件。
Python可變物件和不可變物件
python中一切皆物件,每個物件都有其唯一的id,對應的型別和值,其中id指的是物件在記憶體中的位置。根據物件的值是否可修改分為可變物件和不可變物件。其中,不可物件包括 數字,字串,tuple,frozenset 不可變集合 可變物件包括 list,dict,set python中的變數可以指向任...
Python 可變物件和不可變物件
python在heap中分配的物件分成兩類 可變物件和不可變物件。所謂可變物件是指,物件的內容是可變的,例如list。而不可變的物件則相反,表示其內容不可變。一 不可變物件 由於python中的變數存放的是物件引用,所以對於不可變物件而言,儘管物件本身不可變,但變數的物件引用是可變的。從上面得知,不...
可變物件和不可變物件
要理解可變物件和不可變物件,先要理解final關鍵字。參考此部落格 沒有經過原博主的同意便引用了一些,侵刪!final關鍵字可以用來修飾類 方法和變數 成員或區域性 final修飾類時表明這個類不能被繼承。final類中的方法會被隱式的定義為fianl,變數自行定義需要不要被final修飾。fina...