在Python中,参数是如何传递到函数中的?

在Python中,参数是如何传递到函数中的?,python,Python,基本上,我的问题是,如果我在Python中向一个函数传递一个参数,给它赋值,然后改变那个值,两个值都会改变还是只有一个?函数参数在python中是如何传递的 换句话说,假设我有一个A类的定义如下: class A(object): def __init__(self, b): self._b = b class B(object): def increment(): # Do something ... 其中B类是某个类(确切地说,它

基本上,我的问题是,如果我在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会改变还是保持不变


我希望这个问题是清楚的。我在解释我想问的问题时遇到了很多困难,所以请随时要求澄清

你在这里弄坏了几件东西。示例中的函数参数从未修改过。只有名称和参数所引用的对象才是

Python使用名称,类似于指针和引用——名称指的是对象,但不是对象本身。这里,您正在将B(对象)的实例绑定到instanceOfB(名称):

如果将名称指定给名称,则名称后面的引用将被有效复制。您有两个名称分别引用同一对象。如果将一个名称重新指定给其他名称,则另一个名称不会更改

如果调用函数,则通过值传递名称。也就是说,在函数内部有一个引用同一对象的新名称(可以称为相同名称)

instanceOfA = A(instanceOfB)
# -> A.__init__(self=instanceOfA, b=instanceOfB)
# -> instanceOfA._b = instanceOfB
现在,到目前为止,您只分配了名称。每个赋值都会创建引用的副本,这意味着每个名称都独立工作。然而,尽管instanceOfB有多个名称,但它仍然只有一个instanceOfB。
instanceOfA.\u b
instanceOfB
都指向同一个对象

instanceOfA = A(instanceOfB)
# -> A.__init__(self=instanceOfA, b=instanceOfB)
# -> instanceOfA._b = instanceOfB

现在,如果您修改对象,您将在每个名称上看到此更改,因为它们都只是引用同一个对象。

视情况而定。如果你传递的是一个引用,比如一个列表,那么对该引用的任何副本进行变异都会影响所有引用。如果它是不可变对象,比如字符串、整数或元组,则所有副本都是独立的。也就是说,这实际上与函数调用没有任何关系;对于赋值,您将有完全相同的行为……即:if
a=;b=a;b++
(或
b.append(“foo”)
,或任何东西)为您的值
变异
a,那么在函数调用后面的变异和赋值后面的变异也会发生同样的行为。函数调用与此无关。
instanceOfB
instanceOfA.\u b
都指向同一个对象,如果该对象发生更改,则所有指针都将反映该更改,但是如果将一个变量指定给不同的值(如
instanceOfB=4
),则不会影响其他指针。
instanceOfA = A(instanceOfB)
# -> A.__init__(self=instanceOfA, b=instanceOfB)
# -> instanceOfA._b = instanceOfB