首先需要记住的一点是,在python中,变量的赋值是使用引用来传递的。这也就意味着,不管这个对象是已经存在的还是新创建的,在赋值的时候都将传递这个对象的引用。
学过C++不难发现,所谓引用,其实就是给被引用的变量取了一个别名。
引用一段话 原文链接:https://blog.csdn.net/shen_chengfeng/article/details/80687396
python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
a = 1
print(id(1)) # 1
print(id(a)) # 2 same to 1
a = 2
print(id(a)) # 3 diff from 1
b = 1
print(id(b)) # 4 same to 1
c = a
print(id(c)) # 5 same to 3
若无指定返回值,则函数默认返回值类型为NoneType
num = 5
# 函数的定义部分需要与上面语句间隔两行
def func():
# TODO(cui) 此语句可用于解释将要做什么
"""函数体的整体注释"""
tmp_1 = 10
tmp_2 = 12
print(id(tmp_1), id(tmp_2))
# global 声明变量后,可以修改全局变量,否则python在函数中修改全局变量无效
# 如果不使用global修饰的话,默认在本地创建一个与全局变量同名的新变量
# return (tmp_1, tmp_2)
return tmp_1, tmp_2 # 这样默认返回的是元组的形式
# return [tmp_1, tmp_2]
# result = func() # 使用 列表/元组 接收
tmp1, tmp2 = func() # 接收的变量个数应与返回参数的个数一致,否则报错
print(tmp1, tmp2)
print(id(tmp1), id(tmp2)) # id()可以用于取变量的地址
可变类型变量作为参数传递时,在函数体内部改变该参数值不会对形参造成影响
不可变类型变量作为参数传递时,~~会造成改变
类比于C++中的缺省参数,缺省参数可有可无。
有时可能可能需要一个函数能够处理的参数个数是不确定的,这个时候,就可以使用多值参数。
例如程序:
def func(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
func(0, 1, 2, 3, 4, name="xiaoming", age=18) # 不使用拆包
使用情况:调用函数时,将一个元组变量或一个字典变量直接传递给相应的形参
使用方法:
代码:
def func(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
tp = (1, 2, 3, 4)
dc = {"name": "xiaoming", "age": 18}
func(0, *tp, **dc) # 拆包
算法方面,不再赘述。