零基礎學python-6.2 共享引用

這一章節說說共享引用python

咱們先舉一個樣例函數

a=1
b=a

上面的樣例就是共享引用,這裏咱們說說整個過程:

1.建立一個對象1post

2.建立一個變量a優化

3.把a和1所在的內存空間鏈接起來,就是a引用1.net

4.a正在使用,建立變量bcode

5.a這個時候被對象1替代對象

6.b引用對象1blog

咱們如下舉另外兩個樣例:內存

>>> a=1.1
>>> b=1.1
>>> a is b
False
>>> a=1.1
>>> b=a
>>> a is b
True
>>> 

從樣例中可以看見,最上面的a和b,二者直接分別指向不一樣的對象,如下的a和b,指向的是同一個對象。 這就是共享引用,這是一種內部的優化。


咱們再來舉一些樣例,你們可以思考一下get

a=1
b=a
a='2'

這個時候會如何?

事實上這個時候是這種,b=1。a='2'

再來,

a=1
b=a
a=a+1

這個時候又會是如何?

由於咱們以前已經說過,整數類型對象是不可變,因此。最後的結果是a=2,b=1,2這個對象是又一次建立出來,而後賦值給a。因此不會出現a變b也變的狀況

上面咱們都是引用一些不可變的對象類型,咱們如下引用一些可變的看看如何?

>>> a=[1,2,4]
>>> b=a
>>> b is a
True
>>> a=24
>>> b is a
False
>>> a
24
>>> b
[1, 2, 4]
>>> 

假設咱們從可變的換成不可變的。基本變化不會出現,但是,假設咱們知識修改當中一個值,結果會是如何?

>>> a=[1,2,4]
>>> b=a
>>> b is a
True
>>> a[0]=5
>>> b is a
True
>>> a
[5, 2, 4]
>>> b
[5, 2, 4]
>>> 

咱們從代碼裏面看到,雖然咱們改變了裏面的值,但是兩個變量間的關係沒有改變,而且b隨着a的改變而改變

假設不想出現這樣的狀況。咱們可以使用copy這個函數,或者使用分片

>>> a=[1,2,4]
>>> b=a[:]
>>> b is a
False
>>> a
[1, 2, 4]
>>> b
[1, 2, 4]
>>> 
經過上面的代碼可以看見,a和b事實上是引用兩個不一樣的對象,僅僅只是他們的值一樣

分片一般是用在元組。假設是列表或者字典。則必須使用copy

假設對象裏面還有可變對象類型,那麼需要使用deepcopy這個函數,否則仍是會出現a變b變的狀況

仍是上面的代碼,咱們在最後加一句

>>> a=[1,2,4]
>>> b=a[:]
>>> b is a
False
>>> a
[1, 2, 4]
>>> b
[1, 2, 4]
>>> a==b
True
>>> 

雖然a和b 的引用不一樣。但是假設咱們使用==來對照二者,返回的結果是True,is是對照二者的引用,==對照二者的值



就講到這裏。謝謝你們

------------------------------------------------------------------

點擊跳轉零基礎學python-文件夾

相關文章
相關標籤/搜索