文章目录

  • 一、可变类型与不可变类型
  • 1.前提
  • 2.两种数据类型
  • 不可变数据类型
  • 可变数据类型
  • 3.一个例子
  • 二、函数的一些细节
  • 函数的返回值
  • 传递可变类型与不可变类型参数
  • 函数的缺省参数
  • python中缺省参数的注意事项:
  • 多值参数
  • 拆包语法
  • 递归

一、可变类型与不可变类型

1.前提

首先需要记住的一点是,在python中,变量的赋值是使用引用来传递的。这也就意味着,不管这个对象是已经存在的还是新创建的,在赋值的时候都将传递这个对象的引用。

学过C++不难发现,所谓引用,其实就是给被引用的变量取了一个别名。
引用一段话 原文链接:

python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

2.两种数据类型

不可变数据类型
  • 数字类型:int,bool,float,complex,long(2.x)
  • 字符串:str
  • 元组:tuple
可变数据类型
  • 列表list
  • 字典dict

3.一个例子

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++中的缺省参数,缺省参数可有可无。

python中缺省参数的注意事项:
  • 在函数定义中,缺省参数应该从右向左
  • 在调用具有多个缺省参数的函数时,如果想要给某个具体的缺省参数传递数据,需要指定缺省值名
  • 书写规范:缺省参数的赋值号左右无间隔

多值参数

有时可能可能需要一个函数能够处理的参数个数是不确定的,这个时候,就可以使用多值参数

  • python中有两种多值参数:(1)参数名前加一个*可以接收元组(2)参数名前增加**可以接收字典。
  • 一般给多值参数命名时,习惯使用以下两个名字(1)**args:存放元组参数(2)**kwargs:存放字典的参数

例如程序:

def func(num, *args, **kwargs):
    print(num)
    print(args)
    print(kwargs)


func(0, 1, 2, 3, 4, name="xiaoming", age=18)  # 不使用拆包

输出结果:

python不可重复 python不可改变的类型_python不可重复

拆包语法

使用情况:调用函数时,将一个元组变量或一个字典变量直接传递给相应的形参
使用方法:

  • 在实参的元组变量前加*
  • 在字典变量前加**

代码:

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)  # 拆包

递归

算法方面,不再赘述。