python中 + 和 += 运算符的区别

+ 和 += 是两个不同的运算符,它们在概念和使用上有一些区别。

+ 运算符

+ 运算符用于连接两个可迭代对象(如字符串、列表等)或进行数值相加。在进行字符串和列表连接时会发生迭代操作。

+ 运算符总是创建一个新的对象。

注意:

1要么2个都得是可迭代对象,因为它要进行迭代操作。

2 当2个都是可迭代对象时,类型必须一致。

1字符串连接:

str1 = "Hello"
str2 = "World"
result = str1 + str2
print(result)  # 输出: "HelloWorld"

2列表连接:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
result = list1 + list2
print(result)  # 输出: [1, 2, 3, 4, 5, 6]

当使用 + 运算符连接两个字符串或列表时,它会对每个可迭代对象进行迭代,并将它们的元素逐个连接起来,形成一个新的字符串或列表。

3数值相加:

num1 = 5
num2 = 10
result = num1 + num2
print(result)  # 输出: 15

使用 + 运算符时,原始对象不会被修改,而是创建一个新的对象来保存运算结果。

+= 运算符

+= 运算符用于连接两个可迭代对象(如字符串、列表等)或进行数值相加。在进行字符串和列表连接时会迭代操作。因此,可以将字符串迭代地添加进列表中。

对于可变对象,它将原地更新而不是创建一个新对象。

注意:

1如果左侧是可迭代对象,则右侧必须也是可迭代对象。因为它要进行迭代操作。

2 左右两侧如果是不同类型的可迭代对象,则左侧必须是可变对象。

1列表追加:

my_list = [1, 2, 3]
my_list += [4, 5, 6]
print(my_list)  # 输出: [1, 2, 3, 4, 5, 6]

2数值累加:

num = 5
num += 10
print(num)  # 输出: 15

+= 运算符会在原始对象上进行就地操作,将右侧的对象追加到原始对象中,或对数值进行累加操作,从而修改原始对象本身。

为什么 list = list + string 会报错,而list += string不报错

对于不同的运算符,Python解释器对于操作数的处理方式不同。

当你执行 list = list + string 时会报错,这是因为 + 运算符要求两个操作数的类型是相同的,即都是列表或都是字符串。两个操作数相加,生成一个新的对象。这两个操作数地位上是相等的,如果一个操作数是列表,另一个操作数是字符串,就会引发 TypeError 类型错误。

另一方面,当你执行 list += string 时不会报错,是因为 += 运算符认为左侧变量是主,右侧变量是从属,对于列表这样的可变类型变量是支持原地修改的,也就是说string是作为从属被迭代地添加进list中。

list1 = [1, 2, 3]
string1 = 'abcd'
print(id(list1))  # 3066455543232
list1 += string1
print(id(list1))  # 3066455543232
list1 = list1 + [string1]
print(id(list1))  # 3066458905024
print(list1)  # [1, 2, 3, 'a', 'b', 'c', 'd', 'abcd']

通过这个例子可以看出,list1 += string1是对list1本身进行改变,id没有变。而list1 = list1 + [string1]左边的list1实际上是个新的地址,也就是说它与原来的list1不是同一个变量。

对于不可变类型的变量,+=就不是原地修改,而是创建新的变量。

i = 1
print(id(i)) # 1618750931184
i += 2
print(id(i)) # 1618750931248

i = 'abc'
print(id(i)) # 2804706879856

i += 'def'
print(id(i)) #2804709501744
print(i) # abcdef

总结

对于+运算符,它总是创建一个新的对象,其两边的变量是具有同等地位的,必须是同类型的。

而对于 += 运算符来说,左侧变量具有主导性。当左侧变量是可迭代对象时,左侧对象的类型决定了对右侧对象的要求。

  • 如果左侧是可变对象(如列表),则处于对左侧对象就地修改的情况,此时右侧可以是任意类型的可迭代对象(如列表、元组、字符串等),此操作将右侧的元素添加到左侧对象中。
  • 如果左侧是不可变对象(如字符串、元组),则不能对左侧对象就地修改,而是创建新对象。此时右侧必须是与左侧对象保持类型一致。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值