具体问题如下,希望通过形参修改实例的属性值,预期输出为1,但是输出结果为None,这是什么原因呢?
所用IDE为Jupyter Notebook。
class A:
def __init__(self):
self.a = None
def insert(self, b, val):
if not b:
b = val
A1 = A()
A1.insert(A1.a, 1)
print(A1.a)
运行结果:
None
你A1.insert(A1.a, 1)是把实参A1.a的值复制一份赋值给形参b,
A1.a与形参b没有实质关联,
对方法中形参b重新赋值不会影响实参A1.a
正确方法是这样
class A:
def __init__(self):
self.a = None
def insert(self, b, val):
if not hasattr(self,b) or getattr(self,b)==None:
setattr(self,b,val)
A1 = A()
A1.insert('a', 1)
print(A1.a)
如有帮助,望采纳!谢谢!
因为你的A1.a是不可变对象类型(在C和java里叫值类型),它传递的是值而不是引用。
你想通过函数去修改它,那办法其实很多:
1.把A1.a定义成可变对象类型(引用类型),比如self.a=[0],然后你调用A1.insert(A1.a[0],1)就可以改变它了
2.利用函数返回值。在insert函数里写return b,然后调用的时候A1.a=A1.insert(1).python里只要不在变量前面写两个下划线就都是public
3.反射,楼上已经给出代码,就不赘述了