以下の記事を読んでpythonなのにポインタってどういうことだと気になったので自分で深掘ってみた
https://qiita.com/tsudaryo1715/items/12c4848028716ab015bb
結論からいうと、「ポインタ」を「参照している」と言い換えることで納得できた。
連結リストって何?
まず連結リストは何かを先ほどの記事から抜粋。(元記事も読んでね!)
「連結リストは、「データ部」と「ポインタ部」で構成されたデータ構造です。
ポインタをたどることでデータを取り出すことができます。
また、ポインタには、次のデータのアドレスが格納されています。」
このポインタを別のデータ部にくっつけることで鎖みたいに繋がっていく。
配列との違いは元記事参照。
そもそもポインタって何?
よくポインタは手紙の住所としてたとえて説明されます。
コンピュータのポインタは、変数がメモリ上のどこにあるかを示す「住所」のようなもので、それを使って間接的にデータにアクセスできるというように。
でもこれだとポインタそのものが何なのかよく分からないのでもっと厳密な定義を調べてみる。
「記憶装置の特定の場所を指示すため、(現在のコンピュータの多くは)連続した整数のアドレス(Address)、番地を1バイト単位で割当てている。レジスタや記憶装置の中身は全て有限桁ビット列のデジタル数値であるが、特にアドレス指定のための数値を記憶するレジスタや、記憶装置での特定アドレス(==高級言語での特定変数)を、ポインタと呼んで区別している。」(https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
ポインタは記憶装置の中のアドレスを保持し、そのアドレスを通じてデータを操作できる特別な変数のこと。
pythonでポインタって使えるの?
C言語のようにpythonでポインタは聞いたことがなかったので気になった。
結論から言うと、技術的には可能だがセキュリティの問題から非推奨とのこと。
(https://www.youtube.com/watch?v=lclB2Y22nao)
pythonの連結リストはどうやって作るの?
以下のようにオブジェクトとオブジェクトを結びつけて作る。
node.next = Noneは末尾のノード
ノードが生成されるたびに、そのnext属性は次のノードを参照する。
ちなみにpythonの代入は値などが格納されるのではなく、参照するもの
もっと言うと変数とオブジェクトを結びつけることである。
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def append(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
return
last_node = self.head
while last_node.next:
last_node = last_node.next
last_node.next = new_node
def display(self):
current_node = self.head
while current_node:
print(current_node.data, end=" -> ")
current_node = current_node.next
print("None")
# 使用例
linked_list = LinkedList()
linked_list.append(1)
linked_list.append(2)
linked_list.append(3)
linked_list.display() # Output: 1 -> 2 -> 3 -> None
まとめると、pythonではポインタを使わずにオブジェクトを参照することで連結リストを作っている。元記事ではこのことをポインタと呼んで説明している。