小尹学python

导航

Python:参数传递的内存地址及当中的坑

#  参数传递的是内存地址
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]

posted on 2021-10-12 15:51  小尹学python  阅读(157)  评论(0编辑  收藏  举报