Python按值传递

时间:2018-07-24 17:26:20

标签: python python-3.x

我是Python的初学者。我想知道某些情况下通过值而不是引用来传递。假设我们有课:

class myC():
    def __init__(self, x):
        self.val = x

和功能:

def myF1(myc):
    myc.val = 1
def myF2(myDict):
    myDict['a'] = 0

如果我们定义变量并调用函数:

a = myC(0)
myDict = {}
myF1(a)
myF2(myDict)

由于用户定义的类和字典都是可变类型,因此变量a和myDict的值将更改。是否有蚂蚁方法只是传递变量的值,以使变量本身不会改变?如果有多种方法,请告诉我所有方法。非常感谢。

1 个答案:

答案 0 :(得分:1)

Python总是按值传递。但是,这些值是参考。您在python中拥有的唯一值类型是“ 引用”。 变量是名称,值是引用。

这里证明python通过值传递:

def myfn(x):
    x = 2

a = {}
myfn(a)

如果python传递了对该函数的引用,则函数代码将通过使其引用整数对象a来修改2,但这不会发生。 Python仅将值(作为引用)传递给函数,现在函数内部的x存储该引用。

x是对同一对象的新引用,但是使x存储对其他对象的引用不会修改a。无法修改a名称所持有的引用。您可以修改dict对象,但不能更改a(该dict的引用)的值

如果您要一个新对象,则必须明确复制它。一些不可变的对象(例如整数)具有隐式复制,因为它们在操作时返回了一个新对象:

a = 5
a = a + 2

在此示例中,a + 2语义上创建并返回了一个 new int对象,该对象名称a现在存储了对其的引用。 52未被修改(它们是不可变的)