[笔记] Python 核心编程 第三章

语句与语法

  • 井号(#) 表示之后的字符都是注释
  • 换行(\n) 标准的行分隔符
  • 反斜杠(\) 继续上一行
  • 分号(;) 将两个语句连接在一起
  • 冒号(:) 将代码块的头和体分开
  • 语句(代码块) 用缩进块的方式体现
  • 不同的缩进深度分隔不同的代码块
  • Python 文件以模块的形式组织

变量赋值

Python语言中,等号(=)是主要的赋值操作符(其他的是增量赋值操作符)
注意,赋值并不是直接将一个值赋给一个变量。在Python语言中,对象是通过引用传递的。在赋值时,是将该对象的引用(并不是值)赋值给变量

与C语言不同,赋值语句不是一个表达式,不会返回值,所以下面的语句在python中是非法的

In [1]: x = 1

In [2]: y = (x = x + 1) # 赋值语句不是合法的表达式
  File "", line 1
    y = (x=x+1)
          ^
SyntaxError: invalid syntax

增量赋值
+=、 -=、 *=、 /=、 %=、 **=、 <<=、 >>=、 &=、 ^=、 |=

注意:对于不可变对象,增量赋值和普通赋值两者一致;但是对于可变对象(列表,字典),增量赋值和普通赋值存在差异,要特别注意。

对于不可变对象,A = A + B 和 A += B 两种赋值都会将A指向一个新的对象,即id(A)在赋值前后会改变;对于可变对象,如List,A = [1]; A += [2, 3] A的值变为[1,2,3] 但A指向的List对象不变,即赋值前后id(A)不变;A = [1]; A = A + [2, 3] A的值也变为了[1,2,3],但A指向的List对象变了,即赋值前后id(A)的值变了

多重赋值
x = y = z = 1

多元赋值

In [3]: x, y, z = 1, 2.0, 'a string'

In [4]: x
Out[4]: 1

In [5]: y
Out[5]: 2.0

In [6]: z
Out[6]: 'a string'

多元赋值可以用于变量值互换

In [7]: x, y = 1, 2

In [8]: x
Out[8]: 1

In [9]: y
Out[9]: 2

In [10]: x, y = y, x

In [11]: x
Out[11]: 2

In [12]: y
Out[12]: 1

内存管理

  • 变量无须事先声明;
  • 变量无须指定类型;
  • 程序员不用关心内存管理;
  • 变量名会被“回收”;
  • del语句能直接释放资源;

为了追踪内存中的对象,Python使用了引用计数这项技术。Python内部记录着所有使用中的对象各有多少个引用。一个内部跟踪变量,称为一个引用计数器。每个对象各有多少个引用,简称引用计数。

当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变成0时,它被垃圾回收(严格来说这不是100%正确,不过现阶段你可以这么理解)

增加引用计数
当对象被创建并(将其引用)赋值给变量时,该对象的引用计数就被设置为1.
下面这些情况对象的引用计数会增加

  • 对象被创建 (例: x = 3.14 )
  • 另外的别名被创建 (例: y = x )
  • 作为参数传递给函数 (例: foobar(x) )
  • 成为容器对象的一个元素 (例: myList = [123, x , 'xyz'] )

减少引用计数
当对象的引用被销毁时,会减少引用计数。
下面这些情况对象的引用计数会减少

  • 一个本地引用离开了其作用范围。 比如 foobar() 函数结束
  • 对象的别名被显式销毁。比如 del y
  • 对象的一个别名被赋值给其他对象。比如 x = 'xyz'; y = x; x = 123,当123被赋值给x时,'xyz'计数减1
  • 对象被从一个容器对象中移除。比如 myList.remove(x)
  • 容器对象本身被销毁。比如 del myList

你可能感兴趣的:([笔记] Python 核心编程 第三章)