python可变和不可变对象

本文详细介绍了Python中可变和不可变对象的区别,包括字符串、元组、列表等类型的内存地址变化情况。通过实例展示了在可变和不可变对象上进行操作时内存的变化,并探讨了函数参数传递时的影响。理解这些概念对于优化代码和避免意外修改至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 可变、不可变是指变量所引用的内存中的那块空间是否可以被改变。
  • 当改变变量value时,变量原指定内存地址的值可以被改变,则为可变类型,否则为不可变类型。
  • 改变value值的同时,使用id()函数查看变量id是否变化即可判断是什么类型。

不可变类型

不可变种类

  • number,str,tuple,bool
  • 当改变变量value时,重新分配一块内存空间,使变量指向新的地址。

指向不可变对象的变量改变value

  • 不可变对象+,+=操作都会重新分配内存空间。
a= "nightingale"
print(a, id(a))
a +="s"
print(a, id(a))
result:
nightingale 140139369457712
nightingales 140139369458352
# 变量引用的地址发生了变化,a引用了重新开辟了的新空间。

在这里插入图片描述

a = (1, 2, 3)
b = a
print(a, b, id(a),id(b))
 
a = a + (4,5)
print(a, b, id(a),id(b))
result:
(1, 2, 3) (1, 2, 3) 140446447493624 140446447493624
(1, 2, 3, 4, 5) (1, 2, 3) 140446446797488 140446447493624

在这里插入图片描述

可变类型

可变类型种类

  • list,dictionary,set

指向可变对象的变量改变value

  • 改变变量值,变量所引用的内存中的地址不会被改变,原地址中所存储的内容发生变化。
  • 指向可变对象的变量直接重新赋值,则地址会发生改变。
  • +=不重新创建对象,还在原地址上更改,+会重新创建对象。
  • 直接b=a这种形式,二者指向的是同一个地址。
a=[1,2,3]
print(a, id(a))
a+=[4,5,6]
print(a, id(a))
result:
[1, 2, 3] 140153179393544
[1, 2, 3, 4, 5, 6] 140153179393544
# +=在原地址更改内容

在这里插入图片描述

a=[1,2,3]
print(a, id(a))
a=[4,5,6]
print(a, id(a))
result:
[1, 2, 3] 140325380423176
[4, 5, 6] 140325581106376
# 直接赋值,重新创建对象,原变量引用地址发生改变。

在这里插入图片描述

a = [1, 2, 3]
b = a
print(a, b, id(a),id(b))
a = a + [4, 5]
print(a, b, id(a),id(b))
result:
[1, 2, 3] [1, 2, 3] 139918170480072 139918170480072
[1, 2, 3, 4, 5] [1, 2, 3] 139918191472200 139918170480072
# +重新创建对象

在这里插入图片描述

a = [1, 2, 3]
b = a
print(a, b, id(a),id(b))
 
a += [4, 5]
print(a, b, id(a),id(b))

result:
[1, 2, 3] [1, 2, 3] 140366083399112 140366083399112
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5] 140366083399112 140366083399112

在这里插入图片描述

参数传递

  • 在实参向形参传递的过程中,本质上是:从实参到形参的赋值操作。 而所有的赋值操作都是传递的地址。
  • 实参传递到形参后,在函数中如果改变对象,均按照可变不可变的上述规则。
def test(age, name, score):
    print("test-1", age, name, score, id(age), id(name), id(score))
    score.append(100)
    age = 28
    name = "Jack"
    print("test-2", age, name, score, id(age), id(name), id(score))


age1 = 13
name1 = "Mick"
score1 = [90, 80, 30]
print(age1, name1, score1, id(age1), id(name1), id(score1))
test(age1, name1, score1)
print(age1, name1, score1, id(age1), id(name1), id(score1))

result:
13 Mick [90, 80, 30] 140709201273872 2041676114048 2041676432968
test-1 13 Mick [90, 80, 30] 140709201273872 2041676114048 2041676432968
test-2 28 Jack [90, 80, 30, 100] 140709201274352 2041676112480 2041676432968
13 Mick [90, 80, 30, 100] 140709201273872 2041676114048 2041676432968
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值