【一】可变数据类型
- 对于可变数据类型(如列表,字典等),在函数中修改参数会影响原始对象
【1】字典
dic = {'name': 'Green', 'sex': 'male', 'age': '22'}
print(id(dic)) # 1210849384512
# 修改字典中的值
dic['name'] = 'hqq' # 2359802091584
print(id(dic))
# 对字典进行操作时,值改变的情况下,字典的id也是不变的,所以字典也是可变数据类型
【2】元组
tuple_1 = ('green', 'hqq', [22, '10k'])
tuple_1[1] = 'tom' # 报错:TypeError
tuple_1.append('good') # 报错:TypeError
- 元组内元素无法修改指的是元组内索引指向的内存地址不能被修改
tuple_1 = ('green', 'hqq', [22, '10k'])
print(tuple_1) # ('green', 'hqq', [22, '10k'])
print(id(tuple_1)) # 1730656266560
tuple_1[2][1] = 11
print(tuple_1) # ('green', 'hqq', [22, 11])
print(id(tuple_1)) # 1730656266560
- 如果元组内存在可变类型,修改可变类型后内存地址不变,所以元组也是可变数据类型
【3】列表
list_1 = ['green', 'hqq', '21']
print(id(list_1)) # 2603191532992
list_1[1] = 'GG_BOND'
print(list_1) # ['green', 'GG_BOND', '21']
print(id(list_1)) # 2603191532992
- 可以看到修改列表内容后列表的内存地址没有发生改变,所以列表也是可变数据类型
【4】集合类型
my_set = {1, 2, 3}
print(id(my_set)) # 1175390100992
my_set.add(4)
print(my_set) # {1, 2, 3, 4}
print(id(my_set)) # 1175390100992
【二】不可变数据类型
【1】布尔类型
is_bool = True
print(is_bool) #True
print(id(is_bool)) # 140716556983144
is_bool = False
print(is_bool) # False
print(id(is_bool)) # 140716556983176
- 布尔值的内容改变时,内存地址会改变,所以布尔值是不可变数据类型
【2】数字类型
num = 22
print(id(num)) # 140716558509512
num = 23
print(id(num)) # 140716558509544
- 数字改变时,内存地址会改变,所以数字类型也是不可变数据类型
【3】字符串类型
str_1 = 'My name is green'
print(id(str_1)) # 1962745145152
str_1 = 'My name is hqq'
print(id(str_1)) # 1962744306032
- 当字符串发生改变时,其内存地址也会改变,所以字符串是一个不可变数据类型
【三】补充
【1】Python的传递规则
- 严格意义上来说,Python既不是值传递,也不是引用传递,python是自己的传递方式
- 规则是:
- 如果传递的是不可变类型,在函数中修改,就不会影响原来的变量
- 如果传递的是可变数据类型,在函数中修改,不会影
def modify_immutable(x):
x += 10
print("函数内部:", x)
return x
def modify_mutable(lst):
lst.append(4)
print("函数内部:", lst)
return lst
a = 10
print(id(a)) # 140716576597064
print(id(modify_immutable(a))) # 140716576597384
lis = [1, 2, 3, 4, 5]
print(id(lis)) # 2426037108160
print(id(modify_mutable(lis))) # 2426037108160