python值传递和引用传递
- 1. 引用
- 2. mutable, mutable
- 3. 不可变类型int
- 1. 改变a的值,b会改变吗?
- 2. 函数
- 3. 如果修改字符串内容呢?
- 4. 可变类型列表
- 1. 修改列表
- 2. 函数
- 3. 对整个列表修改呢?
1. 引用
- 说引用前回顾一下对象,万物皆对象,
比如一个对象 a=1,它就由id(地址),type(类型)和值 组合而成。
a = 1
print('id:', id(a))
print('type:', type(a))
print('value:', a)
id: 2111407352112
type: <class 'int'>
value: 1
- 引用
变量主要存储值(对象)在内存中的地址,也可以说为通过地址 ”引用“ 对象。
比如:下面 a = 1,就可以说为a存储了1在内存当中的地址(a引用了1)
变量存储在栈内存,对象存储再堆内存。
- 思考下面变量的引用是否一样?
a = 1
b = a
print(id(a))
print(id(b))
打印结果:
2111407352112
2111407352112
- 下面代码呢?
a = 3
b = [1, 2, 3]
c = [1, 2, 3]
print(id(a))
print(id(b))
print(id(c))
打印结果:
1750845778288
1750846813376
1750846813312
2. mutable, mutable
跟值传递和引用传递有些类似,不可变类型(值传递),可变类型(引用传递)。
- 不可变类型(immutable):
数据不可以直接修改 例如:整数(Number)、字符串(String)、元组(Tuple) - 可变类型(mutable):
数据可以直接被修改 例如:列表(List),集合(Set),字典(Dictionary),对象
如何区分可变类型和不可变类型:主要区分变量指向内存地址的值是否可以改变。
3. 不可变类型int
id():可以查看变量的内存地址
1. 改变a的值,b会改变吗?
注意:
a变量初始化为1,并且赋值给b, 再将变量a进行修改,
修改前:a 和 b 都引用了同一个对象
修改后:相当于重新生成了一个对象2, 让变量a重新指向它
a = 1
b = a
print('a修改前的地址', id(a))
print('b修改前的地址', id(b))
a = 2
print('a修改后', a)
print('b修改后', b)
print('a修改后的地址', id(a))
print('b修改后的地址', id(b))
打印结果:
a修改前的地址 2027386464560
b修改前的地址 2027386464560
a修改后 2
b修改后 1
a修改后的地址 2027386464592
b修改后的地址 2027386464560
修改前:
a和b指向同一个地址
修改后:
相当于重新生成了一个对象2, 让变量a重新指向它
2. 函数
def change_num(a):
a = 10
a = 2
change_num(a)
print(a) # 打印结果结果是 2
3. 如果修改字符串内容呢?
a = '123'
a[0] = '6'
报错:TypeError: 'str' object does not support item assignment
4. 可变类型列表
1. 修改列表
a2 = [1,2,3,4]
b2 = a2
a2[0] = 11
a2.append(5)
print(a2)
print(b2)
print(id(a2))
print(id(b2))
打印结果:
[11, 2, 3, 4, 5]
[11, 2, 3, 4, 5]
2597606536256
2597606536256
2. 函数
def a(li):
li.append([1, 2, 3, 4])
print("函数里面: ", li)
return
li = [10, 20, 30]
a(li)
print("函数外面: ", li)
打印结果:
函数里面: [10, 20, 30, [1, 2, 3, 4]]
函数外面: [10, 20, 30, [1, 2, 3, 4]]
3. 对整个列表修改呢?
如果要对整个进行操作的话,它是immutable不可变类型
def a(li):
li = [1,2,3]
print("函数里面: ", li,id(li))
return
li = [10, 20, 30]
a(li)
print("函数外面: ", li,id(li))
打印结果:
函数里面: [1, 2, 3] 3067161621568
函数外面: [10, 20, 30] 3067161621632