在 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
具有相同值的任何其他名称都可以看到更改。
我知道 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
具有相同值的任何其他名称都可以看到更改。