参数传递
a = [12,34,45]
a = 12
a = "23424"
以上代码中,[12,34,45] 是一个List对象,12是一个Number对象, “23424” 是一个字符串对象,而变量a没有类型,它仅仅是个对象的引用,它可以指向任何类型的对象,相比于 c++ 语法,python 中的变量相当于 c++ 中一个变量的 智能引用,它不需要申明引用的类型,且可以随时转变。
可更改与不可更改对象
在python中,strings,tuples,和numbers是不可更改对象,list,dict,set是可以修改的对象。
- 不可更改类型: 变量赋值a = 5后再赋值a=10,这里实际生成一个int值对象10,再让a指向它,而5被丢弃,不是改变a的值,而是新生成了a。
- 可变类型:变量赋值la=[1,2,3,4]后再赋值la[2]=5是将la中的第三个元素值更改,la本身的地址没有变,只是修改了一部分值。
函数的参数传递
- 不可更改类型:类似c++的按值传递
- 可更改类型:类似c++的按引用传递
python中一切都是对象,严格来说不能说按值传递还是按引用传递,而是传不可变对象和传可变对象。
作用域
变量的访问
- Local 局部作用域
- Enclosing 闭包函数外的函数中
- Global 全局作用域
- Built-in 内置作用域
变量的访问按以上排列顺序查找。
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
Python中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域。其他的代码块(if、try、for、while等)不会引入作用域。
变量的修改
注意如果想在内部作用域修改外部作用域的变量时,需要用到global和nonlocal
num = 1
def fun1():
global num # 需要使用 global 关键字声明,才可以在局部作用域内修改全局变量num
print(num)
num = 123
print(num)
fun1()
print(num)
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明,才可以在局部作用域内修改闭包函数外的函数中的变量
num = 100
print(num)
inner()
print(num)
outer()