基本上,我的问题是,如果我将参数传递给Python中的函数,为其分配一些其他值,然后更改该值,这两个值是否会更改或只是一个?函数参数究竟是如何在python中传递的?
换句话说,我说有一些A类定义如下:
class A(object):
def __init__(self, b):
self._b = b
class B(object):
def increment():
# Do something
...
其中B类是某个类(确切地说它并不重要),b和_b都是B类。如果我做了以下内容:
instanceOfB = B()
instanceOfA = A(instanceOfB)
instanceOfA._b.increment()
是instanceOfB会改变,还是会保持不变?
我希望这个问题很明确。我在解释我想问的问题上遇到了很多麻烦,所以请随时要求澄清!
答案 0 :(得分:2)
你在这里纠结了几件事。您的示例中的函数参数永远不会被修改。只有名称和参数所引用的对象。
Python使用与指针和引用类似的名称 - 名称是指对象,但不是对象本身。在这里,您将B(对象)的实例绑定到instanceOfB(名称):
instanceOfB = B()
如果您将名称分配给名称,则会有效复制名称后面的引用。您有两个名称独立引用同一个对象。如果您将一个名称重新分配给其他名称,则另一个名称不会更改。
如果调用函数,则按值传递名称。也就是说,在函数内部,您有一个引用同一对象的新名称(可以称为相同的名称)。
instanceOfA = A(instanceOfB)
# -> A.__init__(self=instanceOfA, b=instanceOfB)
# -> instanceOfA._b = instanceOfB
现在,到目前为止,您只分配了名称。每个作业都会创建参考的副本,这意味着每个名称都可以独立运行。但是,即使它有多个名称,仍然只有一个instanceOfB。 instanceOfA._b
和instanceOfB
都指向同一个对象。
现在,如果您修改对象,您将在每个名称上看到此更改 - 因为它们都只是引用回同一个对象。