【问题标题】:Python pass by value [duplicate]Python按值传递[重复]
【发布时间】:2019-01-01 10:02:50
【问题描述】:

我是 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 的值会改变,因为用户定义的类和字典都是可变类型。是否有只传递变量值以使变量本身不会改变的 ant 方法?如果有多种方法,请告诉我所有方法。非常感谢。

【问题讨论】:

标签: python python-3.x


【解决方案1】:

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

这是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 没有被修改(它们是不可变的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 2013-12-02
    • 2019-05-07
    • 2012-03-12
    • 2013-09-15
    • 2023-03-07
    • 2012-03-13
    • 2014-09-10
    相关资源
    最近更新 更多