上传网站安装教程,注册网站不用手机短信验证的,有没有可以做翻译的网站吗,钢板出租铺路钢板出租函数的参数传递
函数参数传递有两种方式#xff0c;传值和传引用#xff0c;传值只是把变量的值复制一份给了实参#xff0c;函数内部的操作不会改变函数外部变量的值#xff0c;而传引用传递的是外部变量的地址#xff0c;函数内部直接操作函数外部变量的储存空间#…函数的参数传递
函数参数传递有两种方式传值和传引用传值只是把变量的值复制一份给了实参函数内部的操作不会改变函数外部变量的值而传引用传递的是外部变量的地址函数内部直接操作函数外部变量的储存空间在调用函数之后函数外部变量的值一般会改变
def Demo(a):a a 1print(id(a))if __name__ __main__:a 3print(id(a)) # 140705335465056Demo(a) # 140705335465088print(id(a)) # 140705335465056看到变量a在函数调用前后地址值没有改变证明在传递数值时传递的是变量的值字符等类型也一样然后尝试列表元组
def Demo(a):a.append(3)print(id(a))if __name__ __main__:s [1,2]print(value str(s) address str(id(s))) # value [1, 2]address 1574898786888Demo(s) # value [1, 2, 3]address 1574898786888print(value str(s) address str(id(s))) # value [1, 2, 3]address 1574898786888函数调用前后地址值一致证明传递的是引用并且函数执行以后a的值也发生了改变说明a.append()是在s的内存中操作的
如果传递的是元组应为元组不可修改所以三次输出的都是同一块地址但其实以元组为参数传递时传递的是值。
还有一种情况
def Demo(a):a[0].append(3)print(value str(a) address str(id(a)))if __name__ __main__:a ([1,2], 2)print(value str(a) address str(id(a))) # value ([1, 2], 2)address 2616967970056Demo(a) # value ([1, 2, 3], 2)address 2616967970056print(value str(a) address str(id(a))) # value ([1, 2, 3], 2)address 2616967970056如果元组中的元素是列表在调用函数前后函数外部的a也发生了变化根据刚开始说的这感觉是在传引用但其实不是对于函数外部的a来说他的第0个元素始终是class list,至于列表中元素有没有发生变化元组并不关心元组判断元素有没有改变判断的是元素的地址有没有改变而调用append()函数时传递的是可变元素列表地址值不会发生改变这也就是为什么元组不可变但如果元组中的数据是可变类型的话该数据就可变的原因
总结
python有两种数据类型可变和不可变数据对于可变数据类型诸如列表字典集合在函数传参时传引用对于不可变数据类型如数值字符元组在函数传参时传值但更准确的来说python函数传参时使用传对象引用的方式如果函数收到的是一个可变对象比如字典或者列表的引用就能修改对象的原始值相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象比如数字、字符或者元组的引用就不能直接修改原始对象相当于通过“传值’来传递对象。
最后还是要注意像元组中数据是可变类型的情况
参考链接1 参考链接2