Python青少年简明教程:赋值语句
变量赋值是指将一个值分配给变量的过程。Python 支持多种形式的赋值(assignment),包括基本赋值、多重赋值、链式赋值和解包赋值等。
为了深入理解Python赋值语句机制,先了解一下id()函数。
在Python中,id()函数用于获取对象的唯一标识符(即内存地址)。每个对象(Python语言中,所有的 数据 都被称之为 对象)在内存中都有一个唯一的标识符,可以通过id()函数来获取。
例如id(8.53),它会返回8.53的唯一标识符(内存地址)。这个标识符是一个整数值,用于唯一标识该对象在内存中的位置,类似如2200635092656,注意,这样的值在不同的运行时环境中可能会有所不同,因为它取决于内存管理和对象分配的具体实现。Python的内存管理和对象分配模型是自动的,由Python的内存管理器负责。
看下面情况
解释:在Python中,id()函数返回对象的内存地址,这是每个对象的唯一标识符。
首先,当调用id(21.37)时,Python创建了一个浮点数对象21.37并返回了它的内存地址,即2491682696880。如下图所示:
然后,创建了一个变量a并将其赋值为21.37。此时,Python再次创建了一个新的浮点数对象21.37(因为浮点数是不可变的),并将a指向这个新对象。因此,当调用id(a)时,它返回的是这个新对象的内存地址,即2491682692176。如下图所示:
接下来,创建了一个新的变量b并将其赋值为a。在这种情况下,Python并没有创建新的对象,而是让b指向了a所指向的那个对象。因此,a和b实际上是指向同一个对象,所以id(b)返回的也是同一个内存地址2491682692176。如下图所示:
最后,当打印b时,它显示的是b所指向的那个对象的值,即21.37。
Python中变量赋值语句variable = expression的机制:
1.计算表达式(expression)的值:Python首先会计算等号右边的表达式的值。
2.创建新对象:如果表达式的结果不是已存在的对象,Python会在内存中创建一个新的对象来存储这个结果。
3.变量(variable)绑定:Python会将变量名绑定到新创建的对象,或者说变量指向这个对象。变量实际上是一个引用(或名称),它被绑定到这个对象上。这个过程也被称为“名称绑定”。
这是Python变量赋值的基本机制。
需要注意的是,对于某些特定类型的对象——如小整数(-5到256之间的整数),和特定短字符串,如比较短的只包含ASCII字符,不包含空格,数字或者特殊字符的字面量字符串。当Python解释器启动时,它会预先创建并缓存一定范围内的整数和一些常用的短字符串对象。当你在代码中使用这些值时,Python并不会创建新的对象,而是直接引用已经存在的对象。这就是所谓的"interning"机制。这种机制可以提高Python的运行效率,因为对于这些常用的小整数和短字符串,Python可以避免反复创建和销毁对象,从而节省内存和CPU资源。
下面通过一些代码示例来更好地理解这个过程。
Python 中变量再赋值情况
创建了一个名为 dollars 的变量,并将 2.75 赋值给它
Dollars = 2.75
给变量 dollars 赋以一个新值99.95,当给变量 dollars 赋以一个新值99.95时,虽然旧值 2.75 依然保存在计算机的存储器中,但是因为没有变量引用它,所以这个值已不能再被使用。参见下图:
注意,当存储器中的值,不再被变量引用时,Python 解释器将通过所谓的垃圾收集机制来进行处理,自动地将它们移出存储器。【Python使用引用计数来进行内存管理。Python的引用计数是其内存管理的基础机制之一。每个对象都维护一个计数器,记录有多少引用指向它。这个机制的主要目的是确定何时可以安全地删除一个对象并回收其占用的内存。Python的垃圾回收机制会自动清理不再被用到的值,所以不用担心计算机内存中充满被“丢弃”的无效的值。】
在python中,变量保存的是对象(值)的引用,id()函数可以获取变量在内存中的地址。在Python中,值可以放在内存的某个位置(地址),变量用于引用它们,给变量赋一个新值,原值不会被新值覆盖,变量只是引用了新值。
一定要牢记:在 Python 语言中,变量仅仅是引用存储器中某个数据的名字,并且可以引用任何类型的数据项。
x = 99 语句创建了名为 x 的变量,并赋给它 int 型的值 99。
将一个字符串 'Take me to your leader'赋值给变量 x时,变量 x 不再引用一个 int 型数据,而是引用字符串 'Take me to your leader'。
下面再看看这种情况:
a = 10
b = a
在上述的例子中,我们声明了一个变量 a,其值为 10,然后将 b 也指向 a,这是在内存中的布局是这样的,变量 a 和 b 会指向同一个对象 10,而不是给 b 重新生成一个新的对象。
当执行完 a = a + 10 后,因为整数是不可变对象,所以并不会将 10 变成 20,而是生成一个新的对象 20 ,然后 a 会指向这个新的对象。b 还是指向旧对象 10。
赋值说明
☆基本赋值
最简单的赋值使用符号(=)操作符,将一个值赋给一个变量:
x = 5
name = "Alice"
这里,x被赋值为整数5,name被赋值为字符串"Alice"。
初学者需要注意,符号=在编程中作为赋值操作符的意义和数学中作为等号的意义不同。编程中的赋值表示将右侧的值或表达式的结果赋给左侧的变量。
☆多重赋值
Python允许在一行中对多个变量进行赋值:
a, b, c = 1, 2, 3
☆交换变量赋值
Python提供了一种简洁的方法来交换两个变量的值,而无需借助临时变量,格式:
x, y = y, x
例如:
a = 5
b = 10
a, b = b, a
在上述示例中,a和b的值被交换,a变成10,b变成5。
☆链式赋值
可以在一行中给多个变量赋相同的值:
x = y = z = 0
在上述示例中,整数0被赋值给变量x、y和z。
☆解包赋值
解包赋值允许将一个序列解包并赋值给多个变量。
var = [1, 2, 3]
a, b, c = var
在上述示例中,列表numbers中的元素分别被赋值给变量a、b和c。
☆增强赋值
增强赋值(也称为复合赋值)是一种将操作符与赋值结合在一起的语法,它可以让你更简洁地修改变量的值。Python支持增量赋值运算符,如+=、-=、*=、/=等。如:
x = 5
x += 3 # 等同于 x = x + 3
y = 10
y *= 2 # 等同于 y = y * 2
☆类型推断
Python是动态类型语言,不需要显式声明变量类型:
x = 5 # Python自动将x识别为整数
x = "hello" # 现在x变成了字符串类型
☆条件赋值
条件赋值(也称为条件表达式或三元运算符)是一种简洁的方式来基于条件来赋值。它允许你在一行代码中完成if-else语句的功能。基本语法是:
value = true_expression if condition else false_expression
工作原理是:
如果condition为True,则value被赋予true_expression的值
如果condition为False,则value被赋予false_expression的值
例如:
x = 10
y = 20
max_value = x if x > y else y
print(max_value) # 输出: 20
☆变量引用
“变量引用”(variable reference)也称为“变量绑定”(variable binding),它描述了变量和对象之间的关系。是指变量实际上并不存储数据本身,而是存储了指向存储数据的对象的引用(即内存地址)。这意味着变量是对象的“标签”,你可以通过这个标签来访问和操作对象。Python中的每个数据(例如数字、字符串、列表等)都是一个对象,当你给变量赋值时,实际上是创建了一个从变量到对象的引用。多个变量可以引用同一个对象。
对于不可变对象(如整数、字符串),"修改"实际上是创建新对象并重新赋值。
对于可变对象(如列表、字典),可以通过引用直接修改对象。
重要的是要理解,Python中的变量赋值实际上是创建了对象的引用,示例:
# 整数(不可变对象)
a = 5
b = a # b和a引用同一个对象
print(id(a), id(b)) # 输出相同的ID
a = 6 # a引用新的对象
print(id(a), id(b)) # a和b现在引用不同的对象
# 列表(可变对象)
list1 = [1, 2, 3]
list2 = list1 # list2和list1引用同一个列表对象
list2.append(4) # 通过list2修改对象
print(list1) # 输出 [1, 2, 3, 4],list1也被修改
☆常量约定
Python中并没有内置的常量类型,或者说,Python没有真正的常量,,但有一些广泛接受的约定来表示和使用常量。这些约定主要是编程习惯和风格指南,而不是语言强制执行的规则。常量通常使用全大写字母命名,多个单词之间用下划线分隔。例如:
PI = 3.14159
MAX_SIZE = 100
这些约定主要依赖于程序员的自律。Python不会阻止你修改这些“常量”的值。例如:
PI = 3.14159
PI = 3 # 这是合法的,但违反了常量约定