python中变量pa和pa一样吗_python-变量与参数传递

变量与参数传递

理解变量

抛弃变量是存储数据的盒子这一错误观念,

可以把python变量理解为附加在对象上的标注

来个栗子

a = [1, 2, 3]

b=a

a.append(4)print(a, b) #[1, 2, 3, 4] [1, 2, 3, 4]

print(a is b)

说明:a和b引用同一个列表,而不是这个列表的副本,当为a添加一个元素时,a,b都发生改变并指向同一个列表,

很明显用变量是存储数据的盒子这一观念无法解释。

08f1ee86f83f1fc20aa8d9a18ae33453.png

变量赋值

在python中,通常会说把某个变量分配给某个对象,绝不会说把某个对象分配给某个变量,因为对象在赋值之前就创建了。

a = 3

说明:对于python中的赋值语句,应该先读右边,对象在右边创建或获取,之后将左边的变量绑定到对象上,

这就像往对象上贴上标注。

变量只不过是标注,你无法阻止往对象上贴多个标注,贴的多个标注就是别名。

每个变量都有标识、类型和值,对象一旦创建它的标识就不会变,标识可以理解为对象在内存中的地址。

id()函数返回对象内存地址的整数表示,id是唯一的数值标识,在对象的生命周期中不会改变

标识通常用is运算符检查

==比较的是两个对象中保存的数据,

is比较的是两个对象的标识,is常用于变量与单例值之间的比较:

x isNone:

xis not None:

变量分类

在python中,一切都是对象,变量存储的是对象的引用。

对象可以分为可变对象和不可变对象,可变与不可变是针对对象内容本身而言的。

对象分类

概念

包括

可变对象

对象创建后对象的内容是可以改变的

list, dict, set

不可变对象

对象创建后对象的内容是不可以改变的

bool, int, float, tuple, str, frozens

栗子

不可变对象

x = 1y=xprint(id(x), id(y), id(1)) #postion 1 (8791467483984 8791467483984 8791467483984)

x += 1

print(id(x), id(y), id(1)) #postion 2 (8791467484016 8791467483984 8791467483984)

x, y同时指向对象1,在position1位置,id(x), id(y), id(1)的内存地址一样

x += 1, 开辟了新的内存空间,创建对象2,让x重新指向新的对象2,但是原来的对象1和对象1的内存地址并没有发生变化

优点:

减少重复对象对内存空间的占用

可变对象

可变对象的修改并不会开辟新的内存空间,而是直接在原内存空间上直接修改对象的内容

即对象的内存地址并不会改变,改变的是对象的内容

list1 = [1, 2]print(list1, id(list1)) #position1 ([1, 2] 37249672)

list1.append(3)print(list1, id(list1)) #position2 ([1, 2, 3] 37249672)

参数传递

python唯一支持的参数传递模式是共享传参。

共享传参指函数中的各个形参获得对应实参中各个引用的副本,即函数内部的形参是实参的别名。

x = 1y= [1, 2]deffun(a, b):print(a is x, b isy)

fun(x, y)#True True

说明:当调用函数fun(x, y)时,a和x共同指向数字1,b和y共同指向列表[1, 2],即形参a是实参x的别名,形参b是实参y的别名。

注意:不要使用可变的对象作为参数的默认值,否则可能会得到意想不到的结果。

def extend_element(ele, eles=[]):

eles.append(ele)returneles

list1= extend_element('a')

list2= extend_element(2, [1])

list3= extend_element('b')print(list1, '->', list2, '->', list3) #['a', 'b'] -> [1, 2] -> ['a', 'b']

print(list1 is list3) #True

说明:我们发现list1和list3指向同一个列表,这是为什么呢?

其实这个根源在于,默认值在定义函数时计算,通常在模块加载时,因此默认值变成了函数对象的一个属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值