首页 > 解决方案 > 在 Python 中引用自定义类

问题描述

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

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

我尝试使用自定义类在 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

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

标签: pythonreferenceimmutabilitymutable

解决方案


简短的版本是这样的:

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

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

所以,L =对于任何值的名称都不做任何事情L,它只是L在本地命名空间中为不同的值生成一个名称。

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


推荐阅读