Python基础学习笔记——引用

本文深入解析了Python中的内存管理机制,包括引用的概念及其在程序中的作用。详细对比了可变类型与不可变类型的内存地址变化特点,并通过示例代码演示了不同情况下的内存地址变动。此外,还探讨了引用传递及+=与=操作符的区别。

引用

  • 定义:就是程序中的数据在内存中的一个地址,简称内存地址
  • 扩展:程序中所使用的数据都保存在内存中,变量保存其实就是数据在内存中的一个地址,以后根据内存地址在内存中获取对应的数据。
  • 举例a = 1 严格来说定义了一个变量a,保存的是数据1在内存中的一个地址;通俗来说保存的就是数据1的内存地址。

id()函数

  • 作用查看变量的内存地址
  • 注意id函数获取的内存地址是十进制的,不是16进制的。
a = 1
print("变量a:", id(a), hex(id(a)))

# b保存的是a变量存储的内存地址
b = a
print("变量b:", id(b), hex(id(b)))

a = 2  # a重新赋值,内存地址改变
print("变量a:", id(a), hex(id(a)), a) 
print("变量b:", id(b), hex(id(b)), b)  # b的内存地址不变,指向的还是1

可变类型和不可变类型引用的内存地址变化

  • 可变类型和不可变类型就是看数据更改后,内存地址是否发生变化。
可变类型
  • 可以在原有内存空间的基础上修改数据(添加、删除、修改数据),修改后内存地址不变
  • 可变类型有:列表字典集合
  • 扩展:对于可变类型来说,修改变量保存的数据有两种方式
    1. 在原有内存空间的基础上修改数据,内存地址不变
    2. 重新赋值,注意:变量保存的内存地址会发生变化。
不可变类型
  • 不允许在原有内存空间的基础上修改数据,修改(这里的修改只能是重新赋值)后内存地址改变
  • 不可变类型有:字符串元组数字
  • 扩展:对于不可变类型来说,修改变量只能重新赋值。
my_list = [1, 2]
print("修改前:", my_list, id(my_list))
# 在原有内存空间的基础上修改数据,内存地址不变
my_list.append(3)
print("修改后:", my_list, id(my_list))
# 重新赋值,内存地址改变
my_list = [3, 4]
print("重新赋值后:", my_list, id(my_list))

# 对于不可变类型来说,想要修改变量保存的数据只能通过重新赋值来完成
my_str = "abc"
print("修改前:", my_str, id(my_str))
# 因为字符串是不可变数据类型,不允许在原有内存空间的基础上修改数据
# my_str[1] = 'd'  # (X)
my_str = "adc"
print("修改后:", my_str, id(my_str))

引用传递

  • 在Python里面所有的赋值操作都是引用传递,赋的值本质是一个内存地址。
  • 函数传参,也是按照引用进行传递的。
+==的区别
  • +=:本意是在原有内存空间的基础上要修改数据。
    • 如果param是不可变类型,+=操作是不能在原有内存空间的基础上修改数据,它完成重新开辟一个新的内存空间存储计算后的结果,所以内存地址会发生变化。
    • 如果param是可变类型,+=操作是可以在原有内存空间的基础上修改数据的,修改数据后内存地址不变。
  • =:表示赋值操作,不管是可变类型还是不可变类型,重新赋值内存地址都会发生变化。
def show(param):
    print("传递进函数后数据param:", param, id(param))
    # `+=` 操作
    param += param
    print("+=操作后param:", param, id(param))
    
    # `=` 操作
    param = param + param
    print("=操作后param:", param, id(param))
    
a = [100]
print("原始数据a:", a, id(a))
show(a)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼义虎神

打赏5C币,作者可获得4C币

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值