函數(shù)變與不變python 函數(shù)不變值

python中的可變數(shù)據(jù)類型和不可變數(shù)據(jù)類型的區(qū)別

最近在研究某一博主的代碼時(shí)偶然發(fā)現(xiàn)了一個(gè)問(wèn)題,第一反應(yīng)肯定是我自己知識(shí)上的欠缺。然后經(jīng)過(guò)各種百度啊之類的終于找到了原因。

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、沛縣ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的沛縣網(wǎng)站制作公司

上面就是我遇到的問(wèn)題,按照我的理解,featLabel這個(gè)列表經(jīng)過(guò)函數(shù)調(diào)用后值應(yīng)該還是空的,如果普通的參數(shù),我的這種理解是完全正確的,但是為什么列表featLabel會(huì)跟著改變呢?于是我聯(lián)想到了java里面的像String這種引用數(shù)據(jù)類型,貌似他們有幾分相似之處。好了,問(wèn)題說(shuō)到這,接下來(lái)說(shuō)一下問(wèn)題的解決。

在python中的數(shù)據(jù)可以分為可變數(shù)據(jù)類型和不變數(shù)據(jù)類型。

可變數(shù)據(jù)類型:

像tuple,list,dict之類的變量就是可變數(shù)據(jù)類型,變量名存儲(chǔ)的是一個(gè)地址,該地址指向一個(gè)具體的對(duì)象,并且不管對(duì)變量的值即對(duì)象做怎么樣的操作,都不會(huì)改變變量名存儲(chǔ)的地址。下面是一個(gè)例子:

def?fun(labels):

dic?=?[1,?2,?3]

labels.append(dic)

print(id(labels))

return?dic

if?__name__?==?'__main__':

labels?=?['hello']

my?=?fun(labels)

print(labels,?'\n',?id(labels))

結(jié)果如下:

['hello', [1, 2, 3]]

39593224

可見(jiàn),我們把列表作為參數(shù)傳入一個(gè)函數(shù)時(shí),在函數(shù)內(nèi)我們對(duì)該列表進(jìn)行了一些改變,由于變量存儲(chǔ)的地址沒(méi)有變(在函數(shù)內(nèi)部和函數(shù)外部都是39593224),所以就算我們沒(méi)有故意通過(guò)return語(yǔ)句把該列表傳遞出來(lái),該列表還是會(huì)在函數(shù)執(zhí)行結(jié)束后跟著改變的。

不變數(shù)據(jù)類型:

不變數(shù)據(jù)類型的對(duì)象一旦發(fā)生改變,就會(huì)在內(nèi)存中開(kāi)辟一個(gè)新的空間用于存儲(chǔ)新的對(duì)象,原來(lái)的變量名就會(huì)指向一個(gè)新的地址。舉個(gè)例子:

def?fun(labels):

labels?=?'world'

print(id(labels))

if?__name__?==?'__main__':

labels?=?'hello'

fun(labels)

print(labels,?'\n',?id(labels))

結(jié)果如下:

38578360

hello

39220984

python怎么看函數(shù)是否改變?cè)瓉?lái)變量的值

樓上說(shuō)的很好,初學(xué)小白的我也想到了同樣的問(wèn)題。按照樓上的提示我搜索了不可變對(duì)象與可變對(duì)象,參考該篇博文摘取部分網(wǎng)頁(yè)鏈接網(wǎng)頁(yè)鏈接

python中,對(duì)象分為可變(mutable)和不可變(immutable)兩種類型,元組(tuple)、數(shù)值型(number)、字符串(string)均為不可變對(duì)象,而字典型(dictionary)和列表型(list)的對(duì)象是可變對(duì)象。

所謂可變對(duì)象是所謂可變對(duì)象是指,對(duì)象的內(nèi)容可變,而不可變對(duì)象是指對(duì)象內(nèi)容不可變。

題目中l(wèi)是列表變量,為可變變量,每次調(diào)用函數(shù)可以改變?cè)搶?duì)象的內(nèi)容;而題中的s為字符串變量,是不可變對(duì)象,調(diào)用了字符串操作函數(shù)lstrip()只會(huì)生成一個(gè)拷貝,對(duì)拷貝去除空格,而變量s本身不發(fā)生改變。

python 方法和函數(shù)的區(qū)別

在Python中,對(duì)這兩個(gè)東西有明確的規(guī)定:

函數(shù)function —— A series of statements which returns some value to a caller. It can also be passed zero or more arguments which may be used in the execution of the body.

方法method —— A function which is defined inside a class body. If called as an attribute of an instance of that class, the method will get the instance object as its first argument (which is usually called self).

從定義的角度上看,我們知道函數(shù)(function)就相當(dāng)于一個(gè)數(shù)學(xué)公式,它理論上不與其它東西關(guān)系,它只需要相關(guān)的參數(shù)就可以。所以普通的在module中定義的稱謂函數(shù)是很有道理的。

那么方法的意思就很明確了,它是與某個(gè)對(duì)象相互關(guān)聯(lián)的,也就是說(shuō)它的實(shí)現(xiàn)與某個(gè)對(duì)象有關(guān)聯(lián)關(guān)系。這就是方法。雖然它的定義方式和函數(shù)是一樣的。也就是說(shuō),在Class定義的函數(shù)就是方法。

從上面的角度看似乎很有道理。

def fun():

pass

type(fun)

class 'function' #沒(méi)有問(wèn)題

class Cla():

def fun():

pass

@classmethod

def fun1(cls):

pass

@staticmethod

def fun2():

pass

i=Cla()

Cla.fun.__class__

class 'function' #為什么還是函數(shù)

i.fun.__class__ #這個(gè)還像話

class 'method'

type(Cla.fun1)

class 'method' #這里又是方法

type(i.fun1)

class 'method'#這里仍然是方法

type(Cla.fun2)

class 'function' #這里卻是函數(shù)

type(i.fun2)

class 'function'#這里卻是函數(shù)

事實(shí)上,上面的結(jié)果是可以解釋的:

1,普通方法(老版中直接就是"instancemethod")在module中與在Class中定義的普通函數(shù),從其本身而言是沒(méi)有什么區(qū)別的,他們都是對(duì)象函數(shù)屬性。 之所以會(huì)被說(shuō)在Class中的定義的函數(shù)被稱為方法,是因?yàn)樗緛?lái)就是面向?qū)?lái)的實(shí)例對(duì)象的,其實(shí)他們就是實(shí)例方法,這些方法是與實(shí)例相聯(lián)系的(從實(shí)例出發(fā)訪問(wèn)該函數(shù)會(huì)自動(dòng)賦值)。所以你從Class訪問(wèn)仍然是一個(gè)函數(shù)

2,類方法("classmethod"),因?yàn)轭愅瑯邮菍?duì)象,所以如果函數(shù)與類進(jìn)行聯(lián)系了話(與實(shí)例方法一樣的模式)那么就能夠這么說(shuō)了!

3,靜態(tài)方法,雖然定義在內(nèi)部,并且也較方法,但是卻不與任何對(duì)象聯(lián)系,與從類訪問(wèn)方法是一樣的,他們?nèi)匀皇呛瘮?shù)。

這樣看來(lái)上面的定義可以改改了:

函數(shù)的定義自然不變。

方法的定義可以是這樣的,與某個(gè)對(duì)象進(jìn)行綁定使用的函數(shù)。注意哦。綁定不是指" . "這個(gè)符號(hào),這個(gè)符號(hào)說(shuō)實(shí)在的只有域名的作用。綁定在這里是指,會(huì)默認(rèn)賦值該綁定的對(duì)象。

剛學(xué)python,當(dāng)條件不滿足時(shí),在函數(shù)中調(diào)用函數(shù),函數(shù)返回值為啥不變

這里改一下:

if len(x)!=11:

print('你的號(hào)碼不足11位,無(wú)效!')

x=tel_number() #這里如果不改x的值還是151

return x

當(dāng)前名稱:函數(shù)變與不變python 函數(shù)不變值
分享URL:http://www.muchs.cn/article14/doocjde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、移動(dòng)網(wǎng)站建設(shè)搜索引擎優(yōu)化、電子商務(wù)、網(wǎng)站導(dǎo)航、定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)