繁体   English   中英

python中链表的指针

[英]pointers for linked list in python

我在python中创建了一个链表,并创建了一个指向同一个节点的指针变量。

但是,当我尝试更新指针时,链接列表不会更新。 它仅在我使用原始符号时更新。 以下是需要关注的三行,然后是代码片段:

pointer = self.storage[index]
pointer = pointer.next #does not work
self.storage[index] = self.storage[index].next #DOES work.
def remove(self, key):

        pair = LinkedPair(key,None)
        index = self._hash_mod(pair)

        pointer = self.storage[index]
        prev = None
        while pointer:
            if pointer.key == pair.key:
                if prev is None:  #at the beginning of the linked list, set the head to equal the next value
                    print(self.storage[index] == pointer) #true
                    self.storage[index] = self.storage[index].next
                    pointer = pointer.next
                    # pointer = pointer.next
                    break
                # self.display(pointer,prev,' pointer == pair')
                prev.next = pointer.next
                del pointer
                break
            else:
                prev = pointer
                pointer = pointer.next

            # self.display(pointer,prev,' post shifting')
            # self.storage[index] = self.storage[index].next
        return -1

python 中的变量只是对象的名称,分配给它们只会更改由该名称指定的对象。

但是,当分配给列表的元素时,您正在更改列表中该位置引用的对象。

因此:

pointer = self.storage[index] # 1
pointer = pointer.next  # 2
self.storage[index] = self.storage[index].next  # 3

(1) 使pointer成为在storage[index]处引用的对象的名称

(2) 在赋值=的右侧,查找pointer引用的对象的name属性。 这是self.storage[index].name 赋值将使pointer变量引用self.storage[index].name 要更新self.storage列表,您需要对列表对象本身进行操作。 相反,由pointer引用的self.storage[index]只是“某个对象”。 您甚至无法从那里返回列表,因此无法在此处更改列表。

(3) 然而,在这里,您正在更改列表self.storage ,替换index. You could have done处的元素index. You could have done index. You could have done self.storage[index] = pointer`,效果相同。

当然,python 在底层处理引用(或指针)。 my_list[1] = obj不会为obj分配空间,它将存储对它的引用。 但是局部和全局变量不是引用,它们是名称。

最后,全局和局部命名空间只是将变量名映射到对象。 它们通常只是普通的字典。 您可以通过调用globals()locals()来查看这些。 或者您可以通过更改该字典来“实现”变量赋值:

foo = 1
globals()["foo"] = 2
print(foo)  # --> 2

Python 对变量的赋值与对可变对象(如列表或字典)的赋值不同。 让我们考虑以下语句:

a = 1     # 1
b = [1]   # 2
b[0] = 2  # 3

前两个任务也是如此。 他们正在创建(或更新)全局变量ab ,并将它们分别映射到int对象1list对象[1] 你将拥有:

globals()
{
   ...
   "a": 1,
   "b": [1]
   ...
}

第三个任务完全不同。 这种类型的赋值实际上是由左边的对象实现的。 从文档:

当目标是可变对象(属性引用、订阅或切片)的一部分时,可变对象必须最终执行分配并决定其有效性,如果分配不可接受,则可能引发异常。

这意味着第三条语句是由列表对象本身实现的。 现在python中的列表保留对对象的引用(它不复制对象)。 b[0] ,在表达式中使用时,由列表对象的特殊方法实现,将返回列表在位置 0 引用的对象。 b[0] = 2实际上是调用列表对象的特殊方法,以索引 (0) 和目标对象 (2) 作为参数,列表实现决定它如何更新自身:它将索引 0 处的引用更改为新对象。

这种差异嵌入在python的赋值语句中。 我也喜欢你的完整参考。

更多细节:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM