【问题标题】:How to implement a call-by-reference structure in Python如何在 Python 中实现按引用调用的结构
【发布时间】:2016-04-02 13:54:13
【问题描述】:

我正在编写一个决策树,我决定一个不错的实现是分支的类/对象结构(至少在 C++ 中)。为了简单起见,我将把它分解成必要的部分:

class DecisionTreeBranch:
    def __init__(self):
         parent      = None
         leftBranch  = None
         rightBranch = None

parent 声明通往超级决策的路径,leftBranchrightBranch 定义以下决策。

我想做的事

现在向下不是问题,而是向上移动:假设这棵树首先由左分支定义,所以如果我最终得到一个叶子。我往上走一步,取右分支,继续建造树(如果我往上走,定义了左右,我再往上走一步,依此类推)。

目的是通过三个参数遍历树:parent(向上)和leftBranchrightBranch(向下)

问题

如果我愿意,例如C++ 那么这不会是一个问题,我会用 call-by-reference 定义父级。但是我最近开始用 Python 编程课程,不幸的是我总是以 call-by-value 表达式结束,这肯定会丢失上述分支的所有信息。

基本上我正在寻找类似的东西:

[...]
# define way to former branch 
&curDecision.parent = &oldDecision
oldDecision = curDecision

# continue with the next/new decision on the current level
curDecision = DecisionTreeBranch()
[...]

谁能帮帮我?

亲切的问候

【问题讨论】:

  • 你的python代码实际上是什么样的?目前尚不清楚您是如何解决您所描述的问题的。
  • @pvg 很像:curDecision.parent = oldDecisionoldDecision = curDecision
  • 在 Python 中,除了引用它们之外,您永远不会处理类实例(在这方面它类似于 Java)。当您将这些引用之一传递给函数时,该引用是按值传递的。该函数可以通过引用操作被引用的对象,但它不能修改调用者的引用副本。
  • 我很确定。 python中的所有实例都是堆分配的。当您将 1 分配给变量时,该变量最终会成为实例引用的名称。

标签: python class data-structures pass-by-reference


【解决方案1】:

以下是引用调用的示例。还可以看到由于python中不能使用多个构造函数,所以init方法中使用了关键字参数:

class Maximum:
    def __init__(self,x = None,y = None):
        self.x = x
        self.y = y

    def max(self,Maximum):
        if Maximum.x > Maximum.y:
            print('{0} is maximum.'.format(Maximum.x))
        else:
            print('{0} is maximum.'.format(Maximum.y))

m1 = Maximum()
m2 = Maximum(3,8)
m1.max(m2)

【讨论】:

    【解决方案2】:

    您始终可以传递带有父、左、右键的字典。您将能够修改字典并通过键访问结构。

    【讨论】:

    • 我猜字典实现与类/对象不同(?)
    • 您始终可以传递包含 1 个元素的列表,其中包含您的对象。然后就可以继续使用类对象了。
    • @user3085931,完全没有——或者至少不会以任何方式对您的问题产生影响。在 RobertJacobs 提出的方案中,对字典的引用将按值传递。被调用的函数可以修改其内容,这些修改对调用者是可见的,但它不会导致调用者的引用指向不同的字典。
    猜你喜欢
    • 1970-01-01
    • 2015-03-16
    • 2020-03-24
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    相关资源
    最近更新 更多