python對象變數賦值
⑴ python如何賦值後讓變數保持不變
python中字典和列表都是可變類型,直接通過賦值的方式(也就是淺拷貝),只是創建了新的對象,但實際還是引用了同一個地址,要想修改d而不對dic產生影響,使用深拷貝的方式:
import
d = .deep(dic)
⑵ Python裡面如何拷貝一個對象(賦值,淺拷貝,深拷貝的區別)
賦值(=):就是創建了對象的一個新的引用,修改其中任意一個變數都會影響到另一個。
淺拷貝:創建一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象,另外一個也會修改改變){1,完全切片方法;2,工廠函數,如list();3,模塊的()函數}
深拷貝:創建一個新的對象,並且遞歸的復制它所包含的對象(修改其中一個,另外一個不會改變){模塊的deep.deep()函數}
⑶ Python變數可以只定義不賦值嗎
題主你好,
答案肯定是不可以的.
我在官方文檔上找了一段話,希望對你的理解有幫助:
先看第二個紅框,說的是:
如果使用一個未被定義的變數, 解釋器會報錯.
關鍵是括弧中粉底的那三個詞assigned a value,用來解釋python中怎麼才叫定義一個變數,也就是說你想定義一個變數必須要給它賦值,只有給一個名稱賦了值,才叫定義了一個變數. //有的語言中, 可以使用某個關鍵字先聲明一個變數, 而賦值的操作可以後面做; 還有的語言,你可以只聲明變數而不賦值, 後面使用該未賦值的變數時, 解釋器會根據你聲明的類型賦一個默認值,等等; 也就是說不同語言對變數的處理邏輯可能不同.而 python對變數的處理邏輯就是: 定義和賦值二者綁在一塊了, 即賦值的過程同時完成了"定義+賦值", 不存在"只定義"這個過程.
而python中變數的賦值在第一個紅框中也說明了,就是 使用等號連接變數和值, 左邊變數右邊值.
-----
希望可以幫到題主, 歡迎追問, 如果有啥錯誤歡迎指正.
⑷ Python中的變數引用對象需注意的幾點
給你介紹Python中普通引用和共享引用在引用對象中需要注意的點:
普通引用:
Python中,變數的作用僅僅是一個標識,只有賦值後才被創建,它可以引用任何類型的對象,而且在引用之前必須賦值。賦值後的變數指向響應的對象,擁有該對象的空間。類型屬於對象,但是不是變數。
[python]
view
plain
a
=
3
a
=
"science"
上述代碼說明數值3和字元串「science」分別是兩種對象,初始變數a賦值對象3被創建,變數a指向對象3的內存空間,之後變數a又指向了字元串的內存空間。
共享引用:
[python]
view
plain
a
=
3
b
=
a
上述代碼說明變數a,b同時引用了對象3,兩個變數引用了相同的對象。正是因為兩者都是指向了相同的對象,所以當其中一個變數引用其他對象的時候,不會對另一個變數造成影響。例如:
[python]
view
plain
a
=
「science」
在上面代碼的基礎上,變數a引用了字元串對象「science」,此時變數b依舊引用對象3,而不是「science」。
但是有些對象的操作會在原處修改,例如列表。例如:
[python]
view
plain
a
=
[1,2,3]
b
=
a
變數a,b應用了包含1,2,3對象的列表,自然而然的a[0]引用對象1,如果在變數a中執行操作
[python]
view
plain
a[0]
=
4
那麼變數b就變隨之變為[4,2,3]。避免這種情況可以使用操作,替換引用操作。
⑸ Python對象的拷貝
Python賦值操作或函數參數傳遞,傳遞的永遠是對象引用(即內存地址),而不是對象內容。在Python中一切皆對象,對象又分為可變(mutable)和不可變(immutable)兩種類型。對象拷貝是指在內存中創建新的對象,產生新的內存地址。當頂層對象和它的子元素對象全都是immutable不可變對象時,不存在被拷貝,因為沒有產生新對象。淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象。
Python中一切皆對象,對象就像一個塑料盒子, 裡面裝的是數據。對象有不同類型,例如布爾型和整型,類型決定了可以對它進行的操作。現實生活中的"陶器"會暗含一些信息(例如它可能很重且易碎,注意不要掉到地上)。
對象的類型還決定了它裝著的數據是允許被修改的變數(可變的mutable)還是不可被修改的常量(不可變的immutable)。你可以把不可變對象想像成一個透明但封閉的盒子:你可以看到裡面裝的數據,但是無法改變它。類似地,可變對象就像一個開著口的盒子,你不僅可以看到裡面的數據,還可以拿出來修改它,但你無法改變這個盒子本身,即你無法改變對象的類型。
對象拷貝是指在內存中創建新的對象,產生新的內存地址。
淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。
2.1.1. 頂層是mutable,子元素全是immutable
當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, 'world', 2]
① 創建列表對象並賦值給變數a
② 導入模塊,使用.()函數淺拷貝a,並賦值給變數b
③ 修改變數a的子元素a[0] = 3,由於整數是不可變對象,所以並不是修改1變為3,而是更改a[0]指向對象3
當頂層對象是 mutable可變對象 ,但子元素也存在 mutable可變對象 時,如 [1, 2, ['hello','world']]
① 淺拷貝 .() 只拷貝了頂層對象,沒有拷貝子元素對象['hello','world'],即a[2]和b[2]指向同一個列表對象
② 修改a[2][1] = 'china',則b[2][1] = 'china'
當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)
變數a與變數b指向的是同一個元組對象,沒有拷貝
當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, ['hello','world'])
變數a與變數b指向的是相同的元組對象,並且a[2]與b[2]指向同一個列表,所以修改a[2][1]會影響b[2][1]
深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象
當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, 'world', 2]
變數a與變數b指向不同的列表對象,修改a[0]只是將列表a的第一個元素重新指向新對象,不會影響b[0]
當頂層對象是mutable可變對象,但子元素也存在mutable可變對象時,如[1, 2, ['hello','world']]
深拷貝既拷貝了頂層對象,又遞歸拷貝了子元素對象,所以a[2]與b[2]指向了兩個不同的列表對象(但是列表對象的子元素初始指定的字元串對象一樣),修改a[2][1] = 'china'後,它重新指向了新的字元串對象(內存地址為140531581905808),不會影響到b[2][1]
當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)
變數a與變數b指向的是同一個元組對象,不存在拷貝
當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, ['hello','world'])
變數a與變數b指向的是不同的元組對象,同時a[2]與b[2]指向不同的列表對象,所以修改a[2][1]不會影響b[2][1]
使用=是賦值,即將列表對象的引用也賦值給變數b,可以將列表對象想像成一個盒子,變數a相當於這個盒子上的標簽,執行b = a後,相當於再在這個盒子上貼上b標簽,a和b實際上指向的是同一個對象。因此,無論我們是通過a還是通過b來修改列表的內容,其結果都會作用於雙方。
b/c/d都是a的復制,它們都指向了不同的列表對象,但是沒有拷貝子元素,a[2]和b[2]/c[2]/d[2]指向同一個列表, 相當於淺拷貝的效果
使用分片[:]操作,a和b其實是指向同一個元組,而且沒有拷貝子元素,a[2]和b[2]也指向同一個列表,相當於淺拷貝的效果
同列表類似,可以使用字典的()函數或者轉換函數dict()
變數a與變數b/c指向不同的字典,但是沒有拷貝子元素,a['jobs']和b['jobs']/c['jobs']指定同一個列表, 相當於淺拷貝的效果
同列表類似,可以使用集合的()函數或者轉換函數set()
變數a與變數b/c指向不同的集合,而集合的元素必須是hashable,所以修改集合a不會影響到b/c
⑹ 對python 中class與變數的使用方法詳解
python中的變數定義是很靈活的,很容易搞混淆,特別是對於class的變數的定義,如何定義使用類里的變數是我們維護代碼和保證代碼穩定性的關鍵。
枚舉了各種情況,沒有辦法全部枚舉,但大部分情況應該都已經包含了。
1. 類變數:能夠通過類名或者object的self來訪問到,在類的內部和外部均可達,比如class_var_1
2. 對象變數:可以通過對象的self來使用的變數,通過constructor一路走向去的的self初次被賦值的變數都會成為對象變數,比如object_var_1, object_var_2, object_var_3, object_var_4
3. 內部變數:可以在函數中定義,並加上self前綴,在初次調用過定義的函數後,就可以在後面的對象的函數中被使用,比如internal_var_1
4. 局部變數:在函數內部定義,並使用的變數,在使用完之後就會被回收對類及object不可見
5. 全局變數:定義在類或者函數外部,作用域在變數被定義之後的任意代碼段,比如:global_var_1
⑺ 關於python中的賦值變數的問題
同一個地址,類似於ActionScript3, python中的字元串是不變對象,不允許對其中的字元按下標修改.當為某個字元串變數賦新的字元串值時,僅僅是更改這個變數指向的地址