如何打印实际数据而不是对象的存储位置?

我正在尝试在python中创建一个链表,并且想打印出所有内容,但将其打印为内存位置。我们已经学会了如何在课堂上解决此问题,但目前尚处于半学期,没有人问。

我当前得到的例子:

List: <__main__.LinkedList object at 0x02EA0100>
 index: 0    data: 1     item: <__main__.Node object at 0x02EA00D0>  pointer: <__main__.Node object at 0x02EA0148>
 index: 1    data: 6     item: <__main__.Node object at 0x02EA0148>  pointer: <__main__.Node object at 0x02EA0190>
 index: 2    data: 3     item: <__main__.Node object at 0x02EA0190>  pointer: None

这对我不是很有用。

我用来获得该母胶的方法:

def PrintList(self):
    item = self.list_start
    index = 0
    print(f"List: {self}")
    while item:
        print(
            f"\t index: {index}\t data: {item.data}\t item: {item}\t pointer: {item._get_pointer()}"
            )
        item = item._get_pointer()
        index += 1

我肯定在打印行中出现了问题,我无法发现它。

我知道您不应该在此处放置大量代码,但我需要提供上下文

节点类:

class Node:
def __init__(self,data=None,pointer=None):
    self.data = data
    self.poiner = pointer

def PrintNode(self):
    print(f"Node Data: {self.data}\t self: {self}\t pointer: {self.pointer}\n")

def _set_pointer(self,pointer):
    self.pointer = pointer

def _get_pointer(self):
    return self.pointer

LinkedLis类别:

class LinkedList:
def __init__(self):
    self.list_start = None

def PrintList(self):
    item = self.list_start
    index = 0
    print(f"List: {self}")
    while item:
        print(
            f"\t index: {index}\t data: {item.data}\t item: {item}\t pointer: {item._get_pointer()}"
            )
        item = item._get_pointer()
        index += 1

def _isleagl(self,node):
    if node is None:
        print(f"node' is None")
        return False
    elif type(node) != Node:
        print(f"'node' has worng type: {type(node)}")
        return False
    else:
        return True

def AppendNode(self,node):
    if self._isleagl(node):
        if self.list_start == None:
            self.list_start = node
            node._set_pointer(None)
        else:
            item = self.list_start
            while item:
                if item == node:
                    node = copy.deepcopy(node)
                elif item._get_pointer() is None:
                    item._set_pointer(node)

                    node._set_pointer(None)
                    break
                else:
                    item = item._get_pointer()

def DeleteNode(self,node):
    if self._islegal(node):
        if self.list_start == node:
            self.list_start = node._get_pointer()
        else:
            item = self.list_start
            while item:
                if item._get_pointer() == node:
                    item._set_pointer(node._get_pointer())
                break
            item = item._get_pointer()

菜单系统:#我认为这不会有太大帮助

def main():
my_list = None
my_node = None
while True:
    print("Node Manipulations")
    print("\t 0: Create Node")
    print("\t 1: Set Node Data")
    print("\t 2: Print Node")
    print()
    print("List Manipulations")
    print("\t 3: Create List")
    print("\t 4: Print List")
    print("\t 5: Append Node to List")
    print("\t 6: Delete Node from List")
    print()
    print("X: EXIT Program")
    choice = input("->")
    if choice not in ["0","1","2","3","4","5","6","7","8","9","X","x"]:
        continue

    if choice == "X" or choice == "x":
         break

    elif choice == "0":
        my_node = Node()

    elif choice == "1":
        if my_node is None:
            print("Create Node first")
        else:
            my_node.data = input("Node Data? -> ")

    elif choice == "2":
        if my_node is None:
           print("Create Node first")
        else:
            my_node.PrintNode()

    elif choice == "3":
        my_list = LinkedList()

    elif choice == "4":
        if my_list is None:
           print("Create List first")
        else:
            my_list.PrintList()
            print()

    elif choice == "5":
        if my_list is None:
            print("Create List first")
        else:
            my_list.AppendNode(my_node)

    elif choice == "6":
        if my_list is None:
            print("Create List first")
        else:
            my_list.DeleteNode(my_node)
xuguirong 回答:如何打印实际数据而不是对象的存储位置?

尝试运行以下代码:

class K:
    pass

obj = K()
print(obj)

输出为:

<__main__.K object at 0x01481FE8>

默认情况下,如果您不编写“ to string”方法(或__str__()),则上面的垃圾内容就是python将作为字符串产生的内容。请注意,函数print仅可打印字符串。它不能打印整数或其他任何内容。这样print(n)会在打印所有输入之前将其转换为字符串。以下代码描述了内置print函数的作用:

import sys
def print(*args,sep=" ",end"\n",file=sys.stdout):
    file.write(sep.join(map(str,args)) + end) 

因此,编写您自己的__str__方法:

import sys
import io
class Node:
    def __init__(self,data=None,pointer=None):
        self.data = data
        self.pointer = pointer

    def print_node(self,*,sep="\t",file=sys.stdout):
        print(
            f"Node Data: {self.data}",f"self: {id(self)}",f"pointer: {id(self.pointer)}",sep=sep,file=file
        )

    def _set_pointer(self,pointer):
        self.pointer = pointer

    def _get_pointer(self):
        return self.pointer

    def __str__(self):
        with io.StringIO() as string_stream:
            self.print_node(file=string_stream)
            stryng = string_stream.getvalue()
        return stryng

您的打印节点方法最初名为PrintNode。除非是班级,否则切勿以大写字母开头。写printNodeprint_node

第二,我将f"pointer: {self.pointer}"更改为f"pointer: {id(self.pointer)}"

假设您没有这样做。那么,print_node将打印self.pointer。但是self.pointer是一个节点,因此它将打印self.pointer.pointer。但是self.pointer.pointer是一个节点,因此它将打印self.pointer.pointer.pointer,依此类推……您不想要那样。可以使用id()函数来检索对象的内存地址。

此外,print_node打印自己也是一个坏主意。这只是在请求无限递归。如何打印self?好吧,我打印dataselfpointer。这意味着我必须打印self,这意味着我必须打印self,这意味着我必须打印self,依此类推,直到永远。

,

“ 主要 .K对象,位于0x01481FE8>” 尝试 xyz=str(x.data) print(xyz) xyz将为您提供存储在该位置的数据。 如果您使用列表或任何数据结构,请循环使用它。 在它提供帮助的程序中遇到了类似的问题。

本文链接:https://www.f2er.com/3165383.html

大家都在问