在 Python 中引用自定义 类

Referencing of custom classes in Python

我知道 Python 中的自定义 classes 通常是可变的。因此,在下面的示例中,对函数 inc_age 中的参数 s 所做的任何更改都会反映在调用部分。

class Student:
    def __init__(self, name, age):
            self.name = name
            self.age = age

def inc_age(s):
    s.age += 1


s1 = Student("Test",5)
inc_age(s1)
print(s1.age) # 6

我尝试使用自定义 class 在 Python 中实现链表,如下所示:

class ListNode:
    def __init__(self, data=0, next=None):
            self.data = data
            self.next = next

def next_node(L):
    L = L.next

end = ListNode(3)
mid = ListNode(2,end)
beg = ListNode(1,mid)

next_node(beg)
print(beg.data) # 1

我的问题是为什么在调用部分没有观察到函数 next_node 中对象 L 的变化。

您必须使用 self 寻址属性,并避免使用内置方法的名称命名变量和属性(下一个):

  • 从头部构建链表也是更好的做法
  • 此外,我更正了一些错别字

输出测试从头开始枚举所有节点。

class ListNode:
    def __init__(self, data=0, next_node=None):
        self.data = data
        self.next_node = next_node

    def add_next_node(self, node):
        self.next_node = node


if __name__ == '__main__':
    beg = ListNode(1)
    mid = ListNode(2)
    end = ListNode(3)

    beg.add_next_node(mid)
    mid.add_next_node(end)

    current = beg
    while True:
        print(current.data)
        current = current.next_node
        if current is None:
            break

输出:

1
2
3

简短版本是这样的:

  • 如果您更改 L 中值的属性,这些属性将在对该值的任何其他引用中表示。
  • 如果您只是将局部变量 L 更改为一个完全不同的值的名称,那么除了局部变量 L.
  • 什么都不会改变

如果这让您感到困惑,那么您没有正确思考 Python 中的变量是什么。在某些语言中,例如 C++,变量是值所在的位置。在其他语言中,例如 Python,变量只是一个名称,您可以在名称空间中查找该名称以查找值;价值观随心所欲。

因此,L = 不会对 L 的任何值做任何事情,它只是将 L 变成一个名称,在本地名称空间中,用于不同的名称值。

但是 L.next = 会使 next 成为 L 所引用值的命名空间中不同值的名称。因此与 L 具有相同值的任何其他名称都可以看到更改。