# 参数传递的是内存地址
def fuc_01(i):
print(i,id(i))
j = '关羽'
print(id(j)) # 1985442652400
fuc_01(j) # 关羽 1985442652400
def fuc_02(i):
i.append(2)
j1 = [1,2,3] # j1生成一个内存地址存放[1,2,3]
i1 = fuc_02(j1) # 此内存地址的内容发生变化 i1和i指向同一个地址
print(j1) # 输出:[1, 2, 3, 2]
# 返回值也是内存地址
def fuc_03():
d = [1,2,3] # 创建一块内存地址,d指向这个内存地址
return d # return d也指向这个内存地址
i2 = fuc_03() # i2也指向这个内存地址
print(id(i2)) # 1149311607360
# 如函数二次被引用,则d的值会重新创建一个内存地址
i3 = fuc_03()
print(id(i3)) # 1149309008000
# 如果返回的是字符串或者数字,则内存地址会一样,因为这两种类型会缓存
a = 123
b = 123
print(id(a)) # 2306794281136
print(id(b)) # 2306794281136
# 默认值的坑
def fuc_06(i,j2=[3,6]):
j2.append(44)
print(i,j2)
fuc_06(1) # 输出:1 [3, 6, 44]
fuc_06(3) # 输出:3 [3, 6, 44, 44],原j2维护的内存地址内容发生变化,因此在修改后的基础上增加44
fuc_06(5,[]) # 输出:5 [44],j2新生成内存地址
fuc_06(7) # 输出:7 [3, 6, 44, 44, 44],j2引用原内存维护的地址内容,并追加
def fuc_07(i,j3=[7,8]): # j3指向的内存地址内容为[7,8]
j3.append(i)
return j3
r1 = fuc_07(3) # j3指向的内存地址内容变为[7,8,3]
print(r1) # 输出:[7,8,3]
r2 = fuc_07(4) # j3指向的内存地址内容变为[7,8,3,4]
print(r2) # 输出:[7,8,3,4]
r3 = fuc_07(5,[1,2]) # j3新创建内存地址,存储[1,2]
print(r3) # 输出:[1,2,5]
r4 = fuc_07(6) # j3指向的内存地址内容变为[7,8,3,4,6]
print(r4) # 输出:[7,8,3,4,6]
def fuc_08(i,j3=[7,8]): # j3指向的内存地址内容为[7,8]
j3.append(i)
return j3
r5 = fuc_08(3) # j3指向的内存地址内容变为[7,8,3]
r6 = fuc_08(4) # j3指向的内存地址内容变为[7,8,3,4]
r7 = fuc_08(5,[1,2]) # j3新创建内存地址,存储[1,2]
r8 = fuc_08(6) # j3指向的内存地址内容变为[7,8,3,4,6]
print(r5) # 输出:[7,8,3,4,6]
print(r6) # 输出:[7,8,3,4,6]
print(r7) # 输出:[1,2,5]
print(r8) # 输出:[7,8,3,4,6]