我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第19篇文章,点击检查活动详情

  • 个人网站:【海拥】【摸鱼小游戏】【学习文档】
  • 风趣诙谐的前端学习课程:28个案例趣学前端
  • 想寻觅共同学习沟通、摸鱼划水的小伙伴,请点击【摸鱼学习沟通群】
  • 免费且实用的 Python 刷题(面经大全)网站:点击跳转到网站

在 python 中 a += b 的行为方式并不总是与 a = a + b 相同,相同的操作数在不同的条件下可能会给出不同的成果。但要了解它们为何表现出不同的行为,您有必要深入研究变量的作业原理。

所以首先,你需求知道幕后发生了什么。

创立新变量:

a = 10
print(" id of a : ", id(10) ," Value : ", a )

输出 :

id of a :  11094592  Value :  10

在上面的示例中,值 10 被存储在内存中,并且它的引证被分配给 a。

修正变量:

a = 10 # 为变量赋值创立新目标
print(" id of a : ", id(a) ," Value : ", a )
a = a + 10 # 修正变量的值创立新目标
print(" id of a : ", id(a) ," Value : ", a )
a += 10 # Modifying value of variable creats new object
print(" id of a : ", id(a) ," Value : ", a )

输出 :

id of a :  11094592  Value :  10
id of a :  11094912  Value :  20
id of a :  11095232  Value :  30

每逢我们创立或修正 int、float、char、string 时,它们都会创立新目标并将新创立的引证分配给它们各自的变量。

可是列表中没有看到相同的行为

a = [0, 1] # 将此数组存储在内存中并将其引证分配给a
print("id of a: ",id(a) , "Value : ", a )
a = a + [2, 3] # 这也将在内存中表现相同的存储数据并将 ref 分配给变量
print("id of a: ",id(a) , "Value : ", a )
a += [4, 5]
print("id of a: ",id(a) , "Value : ", a )
#可是现在这将创立新的参阅。 相反,这将修正当时目标,因而指向 a 的一切其他变量也将得到更改

输出:

id of a:  140266311673864 Value :  [0, 1]
id of a:  140266311673608 Value :  [0, 1, 2, 3]
id of a:  140266311673608 Value :  [0, 1, 2, 3, 4, 5]  

此时您能够看到 a = a + b 与 a += b 有时不同的原因。

考虑这些列表操作示例:
示例 1:

list1 = [5, 4, 3, 2, 1]
list2 = list1
list1 += [1, 2, 3, 4] # 修正当时参阅值
print(list1)
print(list2) # 与第 4 行一样,它修正值而不创立指向 list1 的新目标变量 list2 得到更改

输出:

[5, 4, 3, 2, 1, 1, 2, 3, 4]
[5, 4, 3, 2, 1, 1, 2, 3, 4]

Python 教程之运算符(12)a += b 并不总是等价于 a = a + b

示例 2

list1 = [5, 4, 3, 2, 1]
list2 = list1
list1 = list1 + [1, 2, 3, 4]
# list1 的内容与上述程序相同,但 list2 的内容不同。
print(list1)
print(list2)

输出:

[5, 4, 3, 2, 1, 1, 2, 3, 4]
[5, 4, 3, 2, 1]

Python 教程之运算符(12)a += b 并不总是等价于 a = a + b

  • 表达式list1 += [1, 2, 3, 4] 就地修正列表,这意味着它扩展了列表,使得“list1”和“list2”依然具有对同一个列表的引证。
  • 表达式list1 = list1 + [1, 2, 3, 4] 创立一个新列表并将“list1”引证更改为该新列表,“list2”仍引证旧列表。