[英]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
前两个任务也是如此。 他们正在创建(或更新)全局变量a
和b
,并将它们分别映射到int
对象1
和list
对象[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.