关于python中的+、+=、*、*=

部署运行你感兴趣的模型镜像

不废话,直接干货

1.了解一下python的内存机制

a=1
b=1
id(a)=id(b)    #短的字符串,数字python在内存中是一个对象
         
a=[]
b=[]
id(a)!=id(b)      #字典,数组这样的对象在内存中python会创建两个不同的对象
   
a="new a string"
b="new a string"   
id(a)!=id(b)       #长的字符串python在内存中同样会创建两个不同的对象

2.python中万物皆对象(很简单的一句话,也是最核心的一句话)

# 不可变类型
>>>a = 'wangjunjie'
>>>id(a)
4324743920
>>>a += '0817'
>>>id(a)
4324744944
>>>a = a + '0817'
>>>id(a)
4324750584
# 可变类型
>>>my_list = [1, 2, 3]
>>>my_list
[1, 2, 3]
>>>id(my_list)
4324743240
>>>my_list += [4, 5, 6]
>>>my_list
[1, 2, 3, 4, 5, 6]
>>>id(my_list)
4324743240
>>>my_list = my_list + [7, 8, 9]
>>>my_list
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>id(my_list)
4324744136

简单总结上面显示结果的几个重要结论:
1.变量分为不可变类型和可变类型,字符串、元组、整型、浮点型等数字都是不可比那类型,字典、列表、集合是可变类型
2.对于不可变类型,无论是执行a = a+b还是a += b,a的内存地址都会变,可以理解为生成了新的变量;
那对于可变类型,执行my_list = my_list + new_list时,my_list的内存地址发生变化,即my_list变成了一个新的变量;但是在执行my_list += new_list的时候,my_list内存地址不会发生变化,即没有生成新的变量,这种方法效果等类似于列表的extend操作。

**这里有一个例外的类型,小伙伴们要重视,那就是str,str是有__iadd__方法的,只不过不像列表一样地址ID不变,str的地址是会变的

3.两种方法的python底层原理

从方法的背后魔法方法可以清楚的解释这种现象:
+=背后的魔法方法是__iadd__
+背后的魔法方法是__add__
如果一个类,没有实现__iadd__方法的话,python就会退一步调用__add__方法
总体来说,可变类型都有__iadd__方法,而不可变类型没有__iadd__方法
为了方便记忆,我自己是这么记的:=单独出现的作用一般是赋值操作,所以a = a + b实际上就是python帮我们算出来a + b的值之后赋值给了变量a,在python眼中,这两个a本身就是两个毫无关联的对象。

4.举个栗子更好的理解这个问题

>>>my_tuple = (1, 2, [3, 4])
>>>my_tuple[2] += [5, 6]

思考一下此时my_tuple的值

>>> my_tuple = (1, 2, [3, 4])
>>> my_tuple[2] += [5, 6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> my_tuple
(1, 2, [3, 4, 5, 6])
>>> 

猜对了吗?实际上,这里面有两个点,第一个是元组不可变,python确实报错了,但是my_tuple中的列表呢?第二个是实际上元组中的列表只是一个列表对象内存地址的引用而已,所以在执行my_tuple[2] += [5, 6]时候,列表的值被改变了!

注意一下:以上这个报错用my_tuple[2].extend([5, 6])不会报错,这并不违背元组是不可变的原则,因为引用地址确实没变,只不过地址里面的值,已经发生变化了!

5.* 和 *=

其实,这两个和+、+= 基本一样,只不过背后的魔法方法是__imul__和__mul__而已,就这么简单~

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

<think>在之前的对话中,用户询问了Python中`a += 1`的含义和用法。根据提供的引用资料,这个问题涉及到Python中`+=`操作符的行为,特别是与不可变类型和可变类型的区别相关。 用户可能希望理解`a += 1`与`a = a + 1`的区别,以及在不同数据类型上的表现。引用中强调了对于不可变类型(如整数),两者行为相同;而对于可变类型(如列表),`+=`会原地修改对象,而`a = a + 1`会创建新对象。 回顾引用内容: - 引用[1]和[3]讨论了`+=`和`+`在Python中的不同实现机制。 - 引用[2]和[4]解释了可变与不可变类型对操作符行为的影响。 - 引用[5]通过列表示例展示了`+=`对原对象的修改。 因此,回答应涵盖: 1. `a += 1`的基本含义:增量赋值操作 2. 整数(不可变)和列表(可变)上的具体表现差异 3. 内存地址变化说明 4. 引用别名问题(多个变量指向同一对象时的副作用) 相关问题设计围绕: - 其他操作符(如`*=`)的行为 - 自定义类如何实现`+=` - 性能差异的实际影响 - 常见错误场景 回答结构: - 先解释基本用法 - 对比不同数据类型的行为 - 通过代码示例说明差异 - 总结使用注意事项 - 最后提出相关问题 </think>### Python中 `a += 1` 的含义与用法详解 #### 一、基本含义 `a += 1` 是Python的**增量赋值运算符**,等价于 `a = a + 1`,但执行机制有重要差异: 1. **数学逻辑**:将变量 `a` 的值增加1 2. **底层行为**: - 对**不可变类型**(整数、字符串、元组等):创建新对象 - 对**可变类型**(列表、字典等):原地修改原对象 #### 二、关键区别(`+=` vs `= +`) | **操作** | 对象类型 | 内存变化 | 示例结果差异 | |----------------|------------|------------------------|-----------------------| | `a += 1` | 不可变对象 | 创建新对象 | 原对象不变 | | `a += 1` | 可变对象 | **原地修改**原对象 | 关联变量同步变化[^5] | | `a = a + 1` | 所有类型 | 始终创建新对象 | 原对象不受影响[^4] | #### 三、代码示例说明 1. **整数(不可变类型)**: ```python a = 5 print(id(a)) # 输出原内存地址 (例: 140736483034752) a += 1 print(id(a)) # 输出新内存地址 (例: 140736483034784),地址改变 ``` 2. **列表(可变类型)**: ```python lst1 = [1, 2] lst2 = lst1 # lst2是lst1的别名 lst1 += [3] # 原地修改 print(lst1) # 输出 [1, 2, 3] print(lst2) # 输出 [1, 2, 3](lst2同步变化)[^5] # 对比 + 操作 lst1 = [1, 2] lst2 = lst1 lst1 = lst1 + [3] # 创建新对象 print(lst1) # 输出 [1, 2, 3] print(lst2) # 输出 [1, 2](lst2不变)[^4] ``` #### 四、使用场景与注意事项 1. **优先选择 `+=` 的场景**: - 操作大型可变对象(如列表)时避免内存拷贝 - 需要关联变量同步更新时 2. **避免使用 `+=` 的场景**: - 需保留原对象状态时 - 操作元组等不可变对象(实际会报错) 3. **特殊规则**: - 字符串虽不可变,但`+=`可通过优化避免频繁创建新对象 - 自定义类可通过实现`__iadd__`方法定制`+=`行为[^1] > 关键总结:**`+=` 是否原地修改取决于对象的可变性**,这是Python可变性(mutable)设计的核心体现[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值