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

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

在 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]

image.png

示例 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]

image.png

  • 表达式list1 += [1, 2, 3, 4] 就地修改列表,这意味着它扩展了列表,使得“list1”和“list2”仍然具有对同一个列表的引用。
  • 表达式list1 = list1 + [1, 2, 3, 4] 创建一个新列表并将“list1”引用更改为该新列表,“list2”仍引用旧列表。
目录
相关文章
|
9天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
40 8
|
9天前
Seaborn 教程-主题(Theme)
Seaborn 教程-主题(Theme)
30 7
|
9天前
|
Python
Seaborn 教程-模板(Context)
Seaborn 教程-模板(Context)
33 4
|
9天前
|
数据可视化 Python
Seaborn 教程
Seaborn 教程
26 5
|
1月前
|
Python
Python运算符优先级
Python运算符优先级。
22 3
|
1月前
|
Python
Python成员运算符
Python成员运算符
27 2
|
1月前
|
Python
Python身份运算符
Python身份运算符。
23 1
|
1月前
|
Python
SciPy 教程 之 Scipy 显著性检验 9
SciPy 教程之 Scipy 显著性检验第9部分,介绍了显著性检验的基本概念、作用及原理,通过样本信息判断假设是否成立。着重讲解了使用scipy.stats模块进行显著性检验的方法,包括正态性检验中的偏度和峰度计算,以及如何利用normaltest()函数评估数据是否符合正态分布。示例代码展示了如何计算一组随机数的偏度和峰度。
28 1
|
1月前
|
BI Python
SciPy 教程 之 Scipy 显著性检验 8
本教程介绍SciPy中显著性检验的应用,包括如何利用scipy.stats模块进行显著性检验,以判断样本与总体假设间的差异是否显著。通过示例代码展示了如何使用describe()函数获取数组的统计描述信息,如观测次数、最小最大值、均值、方差等。
29 1
|
19天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!

热门文章

最新文章