5分钟掌握 Python 对象的引用

【第1章>第5节】SOM自组织映射网络的理论学习与MATLAB仿真 自组织映射网络(Self-Organizing Map,SOM)是一种无监督学习的人工神经网络,由芬兰学者Teuvo Kohonen于1981年提出,也被称为Kohonen网络。它的主要功能是将高维输入数据映射到低维(通常是二维)的离散网格上,同时保持输入数据的拓扑结构,即相邻的输入数据在映射后的网格上也相邻。 阅读详情

AI派在读学生小姐姐Beyonce

Java实战项目练习群

长按识别下方二维码,按需求添加

扫码添加Beyonce小姐姐

扫码关注

进Java学习大礼包

1. 引言

引用在各种编程语言中都有涉及,如java中值传递和引用传递。python的对象引用也是学习python过程中需要特别关注的一个知识点,特别是对函数参数传递,可能会引起不必要的BUG。本文将对引用做一个梳理,内容涉及如下:

  • 变量和赋值

  • 可变对象和不可变对象

  • 函数参数的引用

  • 浅拷贝和深拷贝

  • 垃圾回收

  • 弱引用

2. python引用

2.1 变量和赋值

任何一个python对象都有标签,类型和值三个属性。标签在对象创建后直到内存回收就保持不变,可以理解为内存地址。

python在给变量赋值,会把赋值的对象的内存地址赋值给变量。也就是说python的变量是地址引用式的变量。引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的值本身。

可以通过is或者比较id()的判断是否引用的是同一个内存地址的变量。

  • == 是比较两个对象的内容是否相等,即两个对象的值是否相等

  • is同时检查对象的值和内存地址。可以通过is判断是否是同一个对象

  • id() 列出变量的内存地址的编号

# 这个例子a 和 b 两个变量共同指向了同一个内存空间
a = [1, 2, 3]
c = [1, 2, 3]
print(a is c) # False
print(a == c) # True
b = a
a.append(5)
print(a is b) # True
  • 初始化赋值:变量的每一次初始化,都开辟了一个新的空间,将新内容的地址赋值给变量

  • 变量赋值:引用地址的传递

2.2 可变对象和不可变对象

python中的一切都是对象。python对象又分为可变对象和不可变对象。二者的区别在于对象的值在不改变内存地址的情况下是否可修改。

  • 可变对象包括字典dict、列表list、集合set、手动声明的类对象等

  • 不可变对象包括数字int float、字符str、None、元组tuple等

下面举几个典型的例子:

  • list 可变对象,内容变更地址不变

    a = [1, 2, 3]
    print(id(a))
    a.append(5)
    print(id(a))
    
  • 不可变对象(常用的共享地址或缓存)

    # 较小整数频繁被使用,python采用共享地址方式来管理
    a = 1
    b = 1
    print(a is b) # True
    
    # 对于单词类str,python采用共享缓存的方式来共享地址
    a = 'hello'
    b = 'hello'
    print(a is b) # True
    
  • 不可变对象(不共享地址)

    a = (1999, 1)
    b = (1999, 1)
    print(a is b) # False
    
    a = 'hello everyone'
    b = 'hello everyone'
    print(a is b) # False
    
  • 元组的相对不可变型

    # 元组的里元素是可变,改变可变的元素,不改变元组的引用
    a = (1999, [1, 2])
    ida = id(a)
    a[-1].append(3)
    idb = id(a)
    
    print(ida == idb) # True
    

这里之所以要提到变量可变和不可变的特性,其实主要是想说明变量的引用其实和变量的可变和不可变没有直接的关系。变量可变和不可变主要着眼点是变量可不可以修改,注意这个修改不是通过赋值的操作来完成。

a = [1, 2, 3]
print(id(a))
a = a + [5]
print(id(a))
# 前后两个变量a, 已经不是同一个地址了

2.3 函数参数的引用

python中函数的传参方式是共享传参,即函数的形参是实参中各个引用的副本(别名)。函数会修改是可变对象的实参(表示的同一个对象);而不会改变实参的引用。

def func(d):
    d['a'] = 10
    d['b'] = 20    # 改变了外部实参的值        
    d = {'a': 0, 'b': 1}  # 赋值操作, 局部d贴向了新的标识
    print(d) # {'a': 0, 'b': 1}

d = {}
func(d)
print(d) # {'a': 10, 'b': 20}

建议不要写上面例子的代码,局部变量和全局变量的名称一样,尽量编码,否则很容易出bug而不自知。

函数的参数的默认值避免使用可变参数,尽量用None来代替。原因是函数的默认值是作为函数对象的属性,如果默认值是可变对象,而且修改了它,那边后续的函数对象都会受到影响。

class bus():
    def __init__(self, param=[]):
        self.param = param
        
    def test(self, elem):
        self.param.append(elem)
b = bus([2, 3])
b.param # [2, 3]

c = bus()
c.test(3)
c.param # [3]

d = bus()
d.param # [3]  # c 中修改了默认值的引用的内容

2.4 浅拷贝和深拷贝

对于可变对象,我们要时刻注意它的可变性,特别是对赋值或者拷贝后的变量做内容修改操作的时候,需要考虑下是否会影响到原始变量的值,如果程序有bug,可以往这方面想一想。这里讲一下拷贝即建立副本。拷贝有两种:

  • 浅拷贝:只复制顶层的对象,对于有嵌套数据结构,内部的元素还是原有对象的引用,这时候需要特别注意

  • 深拷贝:复制了所有对象,递归式的复制所有对象。复制后的对象和原来的对象是完全不同的对象。对于不可变对象来说,浅拷贝和深拷贝都是一样的地址。但是对于嵌套了可变对象元素的情况,就有所不同

test_a = (1, 2, 3)
test_b = copy.copy(test_a)
test_c = copy.deepcopy(test_a)
print(test_a is test_b) # True
print(test_a is test_c) # True

test_a[2].append(5) # 改变不可变对象中可变元素的内容
print(test_a is test_b) # True
print(test_a is test_c) # False
print(test_c) # (1, 2, [3, 4])

对于可变对象,只要拷贝,就创建了一个新的顶层对象。如果是浅拷贝,内部嵌套的可变对象只是拷贝引用,这样就会相互影响。深拷贝就不会有这种问题。

l1 = [3, [66, 55, 44], (2, 3, 4)]
l2 = list(l1) # l2是l1的浅拷贝

# 顶层改变不会相互影响,因为是两个不同对象
l1.append(50) 
print(l1) # 3, [66, 55, 44], (2, 3, 4), 50]
print(l2) # [3, [66, 55, 44], (2, 3, 4)]

# 嵌套可变元素,浅拷贝共享一个地址
l1[1].append(100)
print(l1) # [3, [66, 55, 44, 100], (2, 3, 4), 50]
print(l2) # [3, [66, 55, 44, 100], (2, 3, 4)]

# 嵌套不可变元素,不可变元素的操作是创建一个新的对象,所以不影响
l1[2] += (2,3)
print(l1) # [3, [66, 55, 44, 100], (2, 3, 4, 2, 3), 50]
print(l2) #[3, [66, 55, 44, 100], (2, 3, 4)]

2.5 垃圾回收

python对于垃圾回收,采取的是引用计数为主,标记-清除+分代回收为辅的回收策略。

  • 引用计数:python可以给所有的对象(内存中的区域)维护一个引用计数的属性,在一个引用被创建或复制的时候,让python,把相关对象的引用计数+1;相反当引用被销毁的时候就把相关对象的引用计数-1。当对象的引用计数减到0时,认为整个python中不会再有变量引用这个对象,所以就可以把这个对象所占据的内存空间释放出来了。可以通过sys.getrefcount()来查看对象的引用

  • 分代回收: 分代回收主要是为了提高垃圾回收的效率。对象的创建和消费的频率不一样。由于python在垃圾回收前需要检测是否是垃圾,是否回收,然后再回收。当对象很多的时候,垃圾检测的耗时变得很大,效率很低。python采用的对对象进行分代,按不同的代进行不同的频率的检测。代等级的规则根据对象的生命时间来判断,比如一个对象连续几次检测都是可达的,这个对象代的等级高,降低检测频率。python中默认把所有对象分成三代。第0代包含了最新的对象,第2代则是最早的一些对象

  • 循环引用:一个对象直接或者间接引用自己本身,引用链形成一个环。这样改对象的引用计数永远不可能为0。所有能够引用其他对象的对象都被称为容器(container). 循环引用只能发生容器之间发生. Python的垃圾回收机制利用了这个特点来寻找需要被释放的对象。

import sys
a = [1, 2]
b = a

print(sys.getrefcount(a)) # 3 命令本身也是一次引用
del b
print(sys.getrefcount(a)) # 2 

3. 弱引用

弱引用在许多高级语言中都存在。如前所述,当对象的引用计数为0时,垃圾回收机制就会销毁对象。但有时候需要引用对象,但不希望增加引用计数。这样有什么好处?

  • 应用在缓存中,只存在一定的时间存在。当它引用的对象存在时,则对象可用,当对象不存在时,就返回None

  • 不增加引用计数,在循环引用使用,就降低内存泄露的可能性

这就是弱引用weak reference,不会增加对象的引用数量。引用的目标对象称为 所指对象 (referent)。

import weakref
a_set = {0,1}
wref = weakref.ref(a_set) # 建立弱引用
print(wref()) # {0,1}
a_set = {2, 3, 4} # 原来的a_set 引用计数为0,垃圾回收
print(wref()) # None # 所值对象被垃圾回收, 弱引用也消失为None

弱引用一般使用时weakref集合, weakref.WeakValueDictionary, weakref.WeakKeyDictionary两者的区别是一个是值进行弱引用,一个是可以进行弱引用;另外还有weakref.WeakSet

4. 总结

本文描述python中引用相关的几个方面,希望对大家有帮助。总结如下:

  • 对象赋值就完成引用,变量是地址引用式的变量

  • 要时刻注意,所以引用可变对象对象的改变,是否导致共同引用的变量值得变化

  • 函数会修改是可变对象的实参

  • 浅拷贝只是copy顶层,如果存在内部嵌套可变对象,要注意,copy的还是引用

  • 对象的引用计数为0时,就开始垃圾回收

  • 弱引用为增加引用计数,与被所指对象共存亡,而不影响循环引用

作者简介:wedo实验君, 数据分析师;热爱生活,热爱写作

文末福利

各位猿们,还在为记不住API发愁吗,哈哈哈,最近发现了国外大师整理了一份Python代码速查表和Pycharm快捷键sheet,火爆国外,这里分享给大家。

这个是一份Python代码速查表

下面的宝藏图片是2张(windows && Mac)高清的PyCharm快捷键一览图

怎样获取呢?可以添加我们的AI派团队的Beyonce小姐姐

一定要备注【高清图】哦

????????????????????

➕我们的Beyonce小姐姐微信要记得备注【高清图】哦

来都来了,喜欢的话就请分享、点赞、在看三连再走吧~~~

HotSpot G1 GC 的分区记账、SATB 并发标记与停顿目标调优解析 线上GC毛刺该调停顿目标、加大新生代还是换收集器?本文从HotSpot G1的设计出发,梳理分区与巨型对象、卡表与记忆集、写屏障与细化线程、停顿预测、SATB并发标记、自适应IHOP、混合回收规则及Full GC兜底,并注明JDK8至JDK27的版本差异。文中在JDK8与JDK17上实测:停顿目标从200ms降到20ms,伊甸区缩小四成、P99下降但仍超目标;巨型对象会反复触发又撤销并发标记;JDK17并行Full GC平均停顿约为JDK8的三成。最后给出日志解读、参数清单、调优流程与选型。 阅读详情

相关推荐

MATLAB实战:5步搞定铣削稳定性叶瓣图(附完整代码解析)

本文提供了一份基于MATLAB的铣削稳定性叶瓣图实战指南。通过5个清晰步骤,从动力学原理出发,详细解析了利用半离散法构建稳定性判据、模块化代码设计、高效参数扫描及高级可视化的完整流程,并附有完整代码,帮助工程师快速预测和规避加工颤振,优化铣削工艺参数。

weixin_29197051的博客 197

关于引用赋值给引用的问题

引用可以赋值给引用,如果直接赋值给左值,则进行拷贝,失去引用的意义。

种一棵树最好的时间是十年前,其次是现在 641

ISP-全局色调映射(GTM)算法简单实现

色调映射算法,色彩空间转换LAB

notgoodenouf的博客 2243

【C++】引用

  我们知道,在C语言中有两种传参方式传值和传地址,如下图所示   传值 传地址 优点 形参只是对实参的一份拷贝,在一定程度上可以保护实参 可以通过形参改变实参,传参效率高 缺点 效率低 指针操作复杂,不安全   有没有什么办法可以将这俩种方式结合起来,取其精华呢?   这就产生了C++中引用这一概念,引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 引用的格式:类型名& 引用变量名 =引用实体 代码

Lynn 351

鸿蒙实战开发教程-注册登录页面

在密码输入框中,只要设置TextInput的类型就可以实现带眼睛logo的密码输入框效果:

2401_82546228的博客 3561

千兆网口电路设计中的EMC防护与TVS选型实战

本文深入探讨了千兆网口电路设计中面临的EMC挑战,并提供了TVS二极管选型的实战指南。文章分析了ESD、浪涌和EFT等主要威胁,重点阐述了如何根据工作电压、钳位电压和关键的低结电容等参数为PHY芯片选择匹配的TVS器件,以确保在严苛电磁环境下实现可靠的信号完整性与防护。

m3n5b7v8c9x的博客 531

C++学习心得:引用的详解

一、引用 引用的本质是一个指针常量 二、指针 三、转载 1、引用在创建时必须初始化,引用到一个有效对象;而指针在定义时不必初始化,可以在定义后的任何地方重新赋值。 2、指针可以是NULL,引用不行 3、引用貌似一个对象的小名,一旦初始化指向一个对象,就不能将其他对象重新赋值给该引用,这样引用和原对象的值都会被更改。 4、引用的创建和销毁不会调用类的拷贝构造函数和析构函数。 作者:撒哈拉的水草 链接:https://www.zhihu.com/question/37608201/answer/8

wangpailiulanqi8的博客 992

因内存不足原因导致fragment空白解决方案

在androidx之前,一般我们防止Fragment重建是在actvitity的onCreate方法中使用savedInstanceState?.remove(“android:support:fragments”)或者savedInstanceState?但是在androidx中,使用这两行代码不生效,但是看FragmentActivity中的FRAGMENT_TAG还是android:support:fragments,那为什么会不生效呢,后来点进去看发现。

qq_39431405的博客 548

JS 中引用类型的引用赋值、浅拷贝和深拷贝

改变浅拷贝后对象的引用类型值,原对象的基本类型值就会被改变。深拷贝得到的对象是重新创建的新对象。所以改变赋值后对象的基本类型值和引用类型值,原对象的基本类型值和引用类型值都不会被改变。赋值得到的对象和原对象引用的是堆内存中的同一个地址,指向的是同一个对象。所以改变赋值后对象的基本类型值和引用类型值,原对象的基本类型值和引用类型值也会被改变。改变 obj2 的 name 属性和 hobby 属性的第一个元素,可以看到 obj 的 name 属性值没有被改变,hobby 属性的第一个元素值被改变。

花铛 840

华为OD机试 - 比赛的冠亚季军(Python/JS/C/C++ 双机位C卷 100分)

有个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛,获N (3\leq N< 10000)胜的进入下一轮,实力值大的获胜,实力值相等的情况,id小的情况下获胜,轮空的直接进入下一轮。(0 <= 实力值 <= 10000000000)。输入一行N个数字代表N的运动员的实力值。输出冠亚季军的id,用空格隔开。

学Java,找哪吒 1588

《UDS协议从入门到精通》系列——到底什么是DTC?

到底什么是DTC?看这里,深度图解DTC格式,详述DTC状态位、快照信息和扩展信息!!

车载系统攻城狮 1万+

python 引用传参_5分钟掌握 Python 对象的引用

1. 引言引用在各种编程语言中都有涉及,如java中值传递和引用传递。python的对象引用也是学习python过程中需要特别关注的一个知识点,特别是对函数参数传递,可能会引起不必要的BUG。本文将对引用做一个梳理,内容涉及如下:变量和赋值可变对象和不可变对象函数参数的引用浅拷贝和深拷贝垃圾回收弱引用2. python引用2.1 变量和赋值任何一个python对象都有标签,类型和值三个属性。标签在...

weixin_39686634的博客 147

Dify智能体开发:Dify文件上传

相较于聊天文本,文档文件能够承载大量的信息,例如学术报告、法律合同。受限于 LLM 自身仅能够支持文件或图片,难以获取文件内更加丰富的上下文信息,应用的使用者不得不手动复制粘贴大量信息与 LLM 对话,增加了许多不必要的使用成本。

王国平的博客 2591

python 嵌套引用_5分钟掌握 Python 对象的引用

1. 引言引用在各种编程语言中都有涉及,如java中值传递和引用传递。python的对象引用也是学习python过程中需要特别关注的一个知识点,特别是对函数参数传递,可能会引起不必要的BUG。本文将对引用做一个梳理,内容涉及如下:变量和赋值可变对象和不可变对象函数参数的引用浅拷贝和深拷贝垃圾回收弱引用2. python引用2.1 变量和赋值任何一个python对象都有标签,类型和值三个属...

weixin_36328839的博客 296

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c++ 将引用赋值给引用_5分钟掌握 Python 对象的引用

1. 引言引用在各种编程语言中都有涉及,如java中值传递和引用传递。python的对象引用也是学习python过程中需要特别关注的一个知识点,特别是对函数参数传递,可能会引起不必要的BUG。本文将对引用做一个梳理,内容涉及如下:变量和赋值可变对象和不可变对象函数参数的引用浅拷贝和深拷贝垃圾回收弱引用2. python引用2.1 变量和赋值任何一个python对象都有标签,类型和值三个属...

weixin_28894691的博客 279

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jq 函数引用变量_5分钟掌握 Python 对象的引用

1. 引言引用在各种编程语言中都有涉及,如java中值传递和引用传递。python的对象引用也是学习python过程中需要特别关注的一个知识点,特别是对函数参数传递,可能会引起不必要的BUG。本文将对引用做一个梳理,内容涉及如下:变量和赋值可变对象和不可变对象函数参数的引用浅拷贝和深拷贝垃圾回收弱引用2. python引用2.1 变量和赋值任何一个python对象都有标签,类型和值三个属性。标签在...

weixin_32184669的博客 107

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

萌新也能看,5分钟掌握 Python 对象的引用,这个你学废了吗

1. 引言 引用在各种编程语言中都有涉及,如java中值传递和引用传递。python的对象引用也是学习python过程中需要特别关注的一个知识点,特别是对函数参数传递,可能会引起不必要的BUG。本文将对引用做一个梳理,内容涉及如下: 变量和赋值 可变对象和不可变对象 函数参数的引用 浅拷贝和深拷贝 垃圾回收 弱引用 2. python引用 2.1 变量和赋值 任何一个python对象都有标签,类型和值三个属性。标签在对象创建后直到内存回收就保持不变,可以理解为内存地址。 python在给变量赋值,会把.

weixin_46737755的博客 171

编程知识比拼第八场丨编程考试

上期考试答案及解析:1、A、B、D解析:数组不是Python的内置对象。有的资料说Python中的列表就是数组,这种说法不恰当。在Numpy中有数组对象,在课程《迈向数据科学家:带你玩转...

sinat_32849897的博客 221

【Python低代码内核调试实战指南】:20年专家亲授3大隐性崩溃根源与5分钟定位法

快速定位Python低代码内核调试中的隐性崩溃,专治组件热重载失败、元数据不一致与动态AST解析异常三大根源。涵盖Web IDE与自动化流程场景,提供日志染色、断点注入与快照比对5分钟定位法。高效稳定,值得收藏。

CompiWander的博客 232

终面高压5分钟:用`Stackprof`定位Python内存泄漏

在终面倒计时5分钟内,面试官突然抛出一道难题:如何快速定位并解决Python应用程序中的内存泄漏问题。候选人迅速启动`Stackprof`工具,通过实时分析内存占用,快速锁定泄漏源,并提出优化方案,展现了对Python底层工具的深刻理解和快速问题解决能力。

itAred的博客 833

qualcomm_gbl_exploit_poc 安全清单:TEE 隐患、变砖风险与 POC 使用注意事项全解析

qualcomm_gbl_exploit_poc 是一个利用高通(Qualcomm)平台 GBL 未签名漏洞解锁 bootloader 的安全研究 POC 项目:它把未经签名的 UEFI 应用刷入 efisp 分区,借助 ABL 的特殊函数覆写 RPMB 中存储的锁状态。本文整理一份完整的安全清单,覆盖 TEE 隐患、变砖风险与 POC 使用注意事项,帮助新手在动手之前把风险摸清楚。 > ⚠️

gitblog_00326的博客 932

5分钟搞懂 Python 中的 ‘==‘ 和 ‘is‘ ,看这篇就够了

=用于比较两个对象的值是否相等。is用于比较两个对象的身份(即内存地址)是否相同。**2.缓存机制的影响:**对于一些小整数和短字符串,Python 会进行缓存,因此在这些情况下,is可能会返回True。**3.可变对象和不可变对象:**对于可变对象(如列表、字典等),即使内容相同,它们也是不同的对象;而对于不可变对象(如整数、字符串等),可能会因为缓存机制而指向同一个对象。希望通过这篇文章,你能更清楚地理解 Python 中==和is的区别。

Python_trys的博客 2648

1 分钟读懂:Python 中的对象比较和对象拷贝

本文讲解了Python中对象比较(==和is)与对象拷贝的核心知识。==比较值相等,is比较内存地址相同。Python对小整数(-5~256)有缓存优化。对象拷贝分为浅拷贝(仅复制顶层对象)和深拷贝(递归复制所有嵌套对象),修改原对象的嵌套结构会影响浅拷贝对象。文章通过代码示例清晰展示了这些概念的实际应用场景和注意事项,适合Python开发者提升对对象处理和内存管理的理解。

Balance 504

Python底层三要素:对象引用、GIL边界与内存管理

Python的运行机制并非黑箱,其行为由对象模型、全局解释器锁(GIL)和内存管理三大底层机制共同决定。对象引用决定了变量赋值、参数传递与可变性的本质;GIL并非并发障碍,而是精准控制字节码执行的调度阀门,在I/O和C扩展中自动释放;CPython采用引用计数为主、循环垃圾回收为辅的双轨内存策略,对可变容器跟踪而对不可变类型优化忽略。理解这三者,是解决真实项目中内存泄漏、并发低效与意外共享修改等问题的技术根基。本文聚焦生产级Python服务中高频复现的底层现象,结合`objgraph`、`py-spy`、`

444

python 对象锁_5分钟完全掌握Python协程

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理1. 协程相关的概念1.1 进程和线程进程(Process)是应用程序启动的实例,拥有代码、数据和文件和独立的内存空间,是操作系统最小资源管理单元。每个进程下面有一个或者多个线程(Thread),来负责执行程序的计算,是最小的执行单元。重点是:操作系统会负责进程的资源的分配;控制权主要在操作系统。另一...

weixin_39625782的博客 96
上一篇: 图解:卷积神经网络数学原理解析
下一篇: 解读:为什么要做特征归一化/标准化?
Wang_AI
博客等级 码龄12年 996粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值