Python中变量(含DataFrame)传递及函数赋值问题咨询
关于Python函数修改变量的两个问题解答
嘿,我来帮你把这两个问题掰扯清楚!
一、为什么调用函数后变量a还是0?
这是因为Python里的参数传递规则——对于像整数、字符串这种不可变类型,函数内部对参数的重新赋值其实是创建了新的对象,并不会影响外部原来的变量。
你看你的代码:
def set_values(x,y): x,y=6,7 return x,y set_values(0,0)
这里你把0传进去当x和y,但函数里的x,y=6,7只是在函数内部创建了新的整数对象6和7,和外部的0没有关系。而且你调用函数后没有接收返回值,所以外部自然看不到变化。
解决方法有两种:
- 接收函数的返回值:这是最推荐的方式,直接把函数返回的新值赋值给外部变量:
def set_values(x,y): x,y=6,7 return x,y a, b = set_values(0, 0) print(a) # 输出6,这时候a就被更新啦 - 用可变对象包装(比如列表):如果一定要通过函数直接修改外部变量,可以把变量放进列表(可变类型)里,函数修改列表的元素:
def set_values(lst): lst[0], lst[1] = 6, 7 a_b_list = [0, 0] set_values(a_b_list) a, b = a_b_list[0], a_b_list[1] print(a) # 输出6
二、给变量a、b赋值必须先初始化吗?
分两种情况看:
- 如果是想在函数外部使用a、b:完全不需要提前初始化!你可以直接在调用函数时,用函数的返回值来首次赋值a和b,比如:
def set_values(): return 6, 7 # 这里a和b是第一次被使用,直接接收返回值就行 a, b = set_values() print(a, b) # 输出6 7 - 如果是想在函数内部修改外部的全局变量a、b:那你需要先在外部定义(初始化)它们,然后在函数里用
global声明,但这种方式不推荐,因为全局变量容易让代码逻辑变乱。比如:a = 0 b = 0 def set_values(): global a, b a, b = 6, 7 set_values() print(a) # 输出6
总的来说,优先用返回值接收的方式来获取函数处理后的变量,既清晰又不容易出错~
内容的提问来源于stack exchange,提问作者Riley
相关产品推荐
相关产品推荐

