我正在为教育Python库编写一个链表.以下是代码的重要摘要:
class Element(object):
def __init__(self, value, next):
self.value = value
self.next = next
class LinkedList(object):
def __init__(self):
self.head = None
self.tail = None
def insert_back(self, element):
if self.empty():
self.insert_front(element)
else:
self.tail.next = Element(element, None)
self.tail = self.tail.next
# I'd like to replace the above two lines with this
# self.tail = self.tail.next = Element(element, None)
Run Code Online (Sandbox Code Playgroud)
我的问题来自最后一行.根据这个问题的最佳答案,Python对链式赋值的独特实现是罪魁祸首.
在其他语言中,最后一行与其上面的两行具有相同的效果,但Python Element(element, None)首先计算表达式,然后从左到右分配结果,因此self.tail在之前分配self.tail.next.这导致前一个tail元素没有引用新的tail元素,而新的tail元素引用自身.
我的问题是:有没有办法用一个语句执行这两个任务?
我完全满足于使用更明确的两行分配; 这只是为了好奇心.
作业永远不会被束缚.
赋值首先评估右手表达式,然后从左到右逐个将结果分配给左手目标.
请参阅assigment声明文档:
赋值语句计算表达式列表(请记住,这可以是单个表达式或以逗号分隔的列表,后者产生元组)并从左到右将单个结果对象分配给每个目标列表.
所以你的代码:
self.tail = self.tail.next = Element(element, None)
Run Code Online (Sandbox Code Playgroud)
有效意味着:
result = Element(element, None)
self.tail = result
self.tail.next = result
Run Code Online (Sandbox Code Playgroud)
您可以使用此方法,只需撤消分配顺序:
self.tail.next = self.tail = Element(element, None)
Run Code Online (Sandbox Code Playgroud)
分配正确的顺序:
result = Element(element, None)
self.tail.next = result
self.tail = result
Run Code Online (Sandbox Code Playgroud)
这会导致链接列表的正确行为:
>>> head = tail = Element(0, None)
>>> tail.next = tail = Element(1, None)
>>> head.value
0
>>> head.next
<__main__.Element object at 0x10262e510>
>>> head.next.value
1
>>> tail is head.next
True
>>> tail.next = tail = Element(2, None)
>>> tail is head.next.next
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |