Python 3.6.5函数参数按对象引用传递的困惑及代码问题咨询
问题分析与解决
先把你的代码补全(推测foo_object = ...应该是foo_object = FooClass(func)),当你调用foo_object.give_value(5)时,会发现输出始终是0而非预期的索引值,这就是你遇到的异常行为,咱们来拆解原因和解决办法:
异常原因
1. 函数func完全忽略了传入参数
你定义的func(t)里,根本没用到参数t,而是直接返回全局变量integer的固定值(也就是0)。不管你给func传什么索引,它都只会返回这个全局的0,这是最直接的问题。
2. 变量作用域的误解
你提到对“Python将函数输入作为对象引用的处理方式感到困惑”,这里其实是混淆了函数参数和全局变量的作用域:func里的integer属于全局作用域,和传入的t没有任何关联。Python查找变量时,会优先找局部作用域,找不到才会向上找全局作用域,这里func内部没定义integer,所以直接调用了全局的那个值。
解决方法
根据你的实际需求,分两种场景给出方案:
场景1:希望func返回传入的索引值
如果你的目的是让func返回调用时传入的参数,直接修改func的定义即可:
integer = 0 def func(t): return t # 改为返回传入的参数t class FooClass(object): def __init__(self, input_function): self.function = input_function def give_value(self, index): print(self.function(index)) foo_object = FooClass(func) foo_object.give_value(5) # 现在会输出5
场景2:希望func绑定特定变量(闭包场景)
如果你想让func关联某个变量而非全局的integer,可以用闭包实现,让函数记住定义时的变量环境:
def create_func(target_var): def func(t): # 这里可以根据需求处理,比如返回目标变量和索引的组合 return target_var + t return func class FooClass(object): def __init__(self, input_function): self.function = input_function def give_value(self, index): print(self.function(index)) my_var = 0 custom_func = create_func(my_var) foo_object = FooClass(custom_func) foo_object.give_value(5) # 输出5(0+5)
额外说明:关于Python的参数引用
Python的参数传递是传对象引用:如果参数是可变对象(比如列表、字典),函数内修改对象内部值会影响外部;如果是不可变对象(比如整数、字符串),函数内的赋值不会改变外部变量。但在你的问题里,这个特性并不是异常的根源,核心还是func没有使用传入的参数。
内容的提问来源于stack exchange,提问作者LA. Dufrene
相关产品推荐
相关产品推荐

