函数变与不变python 函数不变值

python中的可变数据类型和不可变数据类型的区别

最近在研究某一博主的代码时偶然发现了一个问题,第一反应肯定是我自己知识上的欠缺。然后经过各种百度啊之类的终于找到了原因。

我们提供的服务有:成都做网站、网站制作、成都外贸网站建设、微信公众号开发、网站优化、网站认证、沛县ssl等。为1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的沛县网站制作公司

上面就是我遇到的问题,按照我的理解,featLabel这个列表经过函数调用后值应该还是空的,如果普通的参数,我的这种理解是完全正确的,但是为什么列表featLabel会跟着改变呢?于是我联想到了java里面的像String这种引用数据类型,貌似他们有几分相似之处。好了,问题说到这,接下来说一下问题的解决。

在python中的数据可以分为可变数据类型和不变数据类型。

可变数据类型:

像tuple,list,dict之类的变量就是可变数据类型,变量名存储的是一个地址,该地址指向一个具体的对象,并且不管对变量的值即对象做怎么样的操作,都不会改变变量名存储的地址。下面是一个例子:

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))

结果如下:

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

39593224

可见,我们把列表作为参数传入一个函数时,在函数内我们对该列表进行了一些改变,由于变量存储的地址没有变(在函数内部和函数外部都是39593224),所以就算我们没有故意通过return语句把该列表传递出来,该列表还是会在函数执行结束后跟着改变的。

不变数据类型:

不变数据类型的对象一旦发生改变,就会在内存中开辟一个新的空间用于存储新的对象,原来的变量名就会指向一个新的地址。举个例子:

def fun(labels):

labels = 'world'

print(id(labels))

if __name__ == '__main__':

labels = 'hello'

fun(labels)

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

结果如下:

38578360

hello

39220984

python怎么看函数是否改变原来变量的值

楼上说的很好,初学小白的我也想到了同样的问题。按照楼上的提示我搜索了不可变对象与可变对象,参考该篇博文摘取部分网页链接网页链接

python中,对象分为可变(mutable)和不可变(immutable)两种类型,元组(tuple)、数值型(number)、字符串(string)均为不可变对象,而字典型(dictionary)和列表型(list)的对象是可变对象。

所谓可变对象是所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变。

题目中l是列表变量,为可变变量,每次调用函数可以改变该对象的内容;而题中的s为字符串变量,是不可变对象,调用了字符串操作函数lstrip()只会生成一个拷贝,对拷贝去除空格,而变量s本身不发生改变。

python 方法和函数的区别

在Python中,对这两个东西有明确的规定:

函数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).

从定义的角度上看,我们知道函数(function)就相当于一个数学公式,它理论上不与其它东西关系,它只需要相关的参数就可以。所以普通的在module中定义的称谓函数是很有道理的。

那么方法的意思就很明确了,它是与某个对象相互关联的,也就是说它的实现与某个对象有关联关系。这就是方法。虽然它的定义方式和函数是一样的。也就是说,在Class定义的函数就是方法。

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

def fun():

pass

type(fun)

class 'function' #没有问题

class Cla():

def fun():

pass

@classmethod

def fun1(cls):

pass

@staticmethod

def fun2():

pass

i=Cla()

Cla.fun.__class__

class 'function' #为什么还是函数

i.fun.__class__ #这个还像话

class 'method'

type(Cla.fun1)

class 'method' #这里又是方法

type(i.fun1)

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

type(Cla.fun2)

class 'function' #这里却是函数

type(i.fun2)

class 'function'#这里却是函数

事实上,上面的结果是可以解释的:

1,普通方法(老版中直接就是"instancemethod")在module中与在Class中定义的普通函数,从其本身而言是没有什么区别的,他们都是对象函数属性。 之所以会被说在Class中的定义的函数被称为方法,是因为它本来就是面向将来的实例对象的,其实他们就是实例方法,这些方法是与实例相联系的(从实例出发访问该函数会自动赋值)。所以你从Class访问仍然是一个函数

2,类方法("classmethod"),因为类同样是对象,所以如果函数与类进行联系了话(与实例方法一样的模式)那么就能够这么说了!

3,静态方法,虽然定义在内部,并且也较方法,但是却不与任何对象联系,与从类访问方法是一样的,他们仍然是函数。

这样看来上面的定义可以改改了:

函数的定义自然不变。

方法的定义可以是这样的,与某个对象进行绑定使用的函数。注意哦。绑定不是指" . "这个符号,这个符号说实在的只有域名的作用。绑定在这里是指,会默认赋值该绑定的对象。

刚学python,当条件不满足时,在函数中调用函数,函数返回值为啥不变

这里改一下:

if len(x)!=11:

print('你的号码不足11位,无效!')

x=tel_number() #这里如果不改x的值还是151

return x


当前名称:函数变与不变python 函数不变值
本文来源:http://myzitong.com/article/doocjde.html