Python传不可变对象(值类型)
def changeInt(a): # 定义方法:方法名和形参aprint(id(a)) # 打印此时a的地址print(a) # 打印此时的a的值a = 10 # 方法内容 将传进来的值改为int类型的10print(id(a)) # 打印a的内存地址print(a) # 输出a的值b = 2print(id(b))changeInt(b)print(b)print(id(b))
运行结果:
1407087266696161407087266696162140708726669872102140708726669616
解释:该代码中有int类型的对象2,指向他的变量是b(地址),在b传递给changeInt()的时候,隐含了将实参a赋值给形参b的代码段,如:
b=a
那按照【点击上一节】文章来讲,不同变量指向相同对象,那么这两个对象的地址也一定相同,后续方法内首先打印了a的地址,a与b地址相同,那么地址相同了那值也应该相同吧?虽然至此我们都还没为a显式的赋值过,紧跟其后打印了a的值,确实如此,并没有对a进行初始化,但a却等于2,后来又对a赋值了10,那么如上节课的结论,对不可变对象重复赋值,新的赋值会导致地址一定会改变,直至方法结束,b从未参与,当然也不会发生改变。
Python传可变对象(引用类型)
def changeme(list): # 定义方法:方法名和形参listprint(id(list)) # 打印此时list的地址print(list) # 打印此时list的值list.append([1, 2, 3, 4]) # 方法内容 执行列表的实例方法print(id(list)) # 打印list的内存地址print("函数内取值: ", list) # 输出list的值mylist = [10, 20, 30]print(id(mylist))changeme(mylist)print("函数外取值: ", mylist)
运行结果:
23808720450642380872045064[10, 20, 30]2380872045064函数内取值: [10, 20, 30, [1, 2, 3, 4]]函数外取值: [10, 20, 30, [1, 2, 3, 4]]
解释:该代码中有list类型的对象[10,20,30],指向他的变量是mylist(地址),在mylist传递给changeme()的时候,隐含了将实参mylist赋值给形参list的代码段,如:
list=mylist
list与mylist地址相同,那么内存的内容也相同,后续list执行实例方法,如上一节文章所述,会在原有地址上修改,自然方法外的变量由于是相同引用,自然也就发生改变了。【点击上一节】
这两篇文章仔细跟着思路走会有很大的收获,对于底层的了解也会更深一步。如果有不正确的地方恳请指正。
文章转载自工业解决方案,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




