Python基础2:语句语法、内存管理
一、语句与语法
注释
#注释语句 可注释单行
"""注释语句""" 可注释多行(前后各三个英文双引号)
'''注释语句''' 可注释多行(前后各三个英文单引号)
多行一个语句
Python 语句,一般使用换行分隔,也就是说一行一个语句。过长的语句可以使用反斜杠( \ ) 分解成几行。
注:在含有小括号、中括号、花括号时可以多行书写。三引号包括下的字符串也可以跨行书写。
一行多个语句
分号( ; )允许将多个语句写在同一行上,语句之间用分号隔开。
注:这会大大降低代码的可读性,Python 虽然允许但不提倡这么做。
代码组
缩进相同的一组语句构成一个代码块,我们称之代码组。
没有缩进的代码块是最高层次的,被称做脚本的“main”部分。
注:每层缩进一般为四个空格或一个制表符。
模块
每一个 Python 脚本文件被当成是一个模块。
模块可以包含直接运行的代码块、类定义、函数定义或这几者的组合。
推荐在模块中通过 if __name__ == '__main__': 执行主程序:
如果模块是被导入, __name__ 的值为模块名字
如果模块是被直接执行, __name__ 的值为 '__main__'
if __name__ == '__main__':
test()
二、内存管理
变量定义
在 Python 中,变量在第一次被赋值时自动声明,并根据右侧的操作数来决定变量的类型。
和其他大多数语言一样,变量只有被创建和赋值后才能被使用。
引用计数
当对象被创建并(将其引用)赋值给变量时,该对象的引用计数就被设置为 1。
当同一个对象被赋值给其它变量,或作为参数传递给函数, 方法或类实例时,该对象的引用计数自动加 1。
当引用离开其作用范围时,对象的引用计数也减 1;被赋值给另外一个对象时,原对象的引用计数也会自动减 1。
例:
foo = 'xyz' # 对象'xyz'被创建并赋值给变量foo,其引用计数被设置为1
bar = foo # 对象'xyz'被赋值给变量bar,其引用计数加1
foo = 123 # foo被赋值给另外一个对象,'xyz'的引用计数减1
变量的作用域
定义在函数内部的变量拥有局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在(其被声明的)函数内部访问,而全局变量可以在整个程序范围内访问。
调用函数时,该位置可以访问的所有变量名称,都将被加入到所调用函数的作用域中。
不可变类型
数字(int、float)、字符串(str)、元组(tuple)
不能对其指向的对象进行修改!
python中多个不可变类型变量被赋值为同一对象时,指向同一内存地址。(以对象为核心,每个对象对应一个内存地址)
若不可变类型变量被重新赋值为其他对象,该变量指向新对象的内存地址。(而不是对原对象进行修改)
元组
因为指向的对象不能更改,所以元组(tuple)中的内容不能修改。但是可以将整个元组指向新的对象。
#创建元组
a = ('111', '222', '333')
#错误:元组中的内容不能修改!
错误范例:a[0] = 'aaa'
#正确:元组可以指向新的对象
a = ('aaa', 'bbb', 'ccc')
参数传递
进行参数传递时,传的只是变量指向的对象,在函数内会创建新的临时变量指向该对象。
因此在函数内对临时变量进行修改,只是临时变量指向的对象发生了改变,不会影响原变量的值(指向的对象)。
可变类型
列表(list)、字典(dict)、集合(set)
可以对其指向的对象进行修改!(内存地址不发生改变)
python中多个可变类型变量被赋值为同一对象时,指向不同内存地址。(以变量为核心,每个变量对应一个内存地址)
浅拷贝:
直接赋值传递可变类型变量的方式被叫做浅拷贝,复制的变量发生变化,原变量也随着发生变化。
浅拷贝和原变量指向同一对象,如果对原变量指向的对象进行修改,浅拷贝的对象也同时发生变化。
(仅限于修改,若指向新的对象,不会影响)
a=[1,2,3,4,5]
b=a
b[2]=0
print(a)
output: [1, 2, 0, 4, 5]
深拷贝:
在python中复制一个新列表,操作不影响原列表的方法有:
list1 = [1,2,3,4]
使用切片
切片在python中的作用是非常大的,可用作于所有的可迭代对象。使用:
list2 = list1[:]
使用copy
copy在python中可以实现拷贝一个对象。使用:
list2 = list1.copy()
使用循环复制法
可以循环遍历list1,将值插入到list2中。使用:
list2 = [for i in list1]
a=[1,2,3,4,5]
b=a.copy()
b[2]=0
print(a)
output: [1, 2, 3, 4, 5]
参数传递
进行参数传递时,是将变量真正的传过去。
因此在函数内对变量进行修改,函数外部的变量也会受到影响。