Python 动态结构和内存重定位
Python dynamic structure and memory rellocation
我遇到这个错误,我认为可能与内存有关。
我有一个 class Page()
class Page:
index = [None] * 3
is_word = False #If this is false, then is not an end word, just a passing index
页面用于构建动态结构,索引是指向其他页面的指针(或地址)数组。
最初这个地址是空的,只有在添加时它们才会包含另一个页面的地址。
如您所见,创建任何页面时,索引的所有值都为 none。
在我的代码的一部分中,我有这个:
self.index[1] = Page() #Create new page
new_page = self.index[1]
执行此代码后,初始页面 应包含在数组索引中:
- None
- 新建页面
- None
而new_page应该包含在数组索引中:
- None
- None
- None
问题是 new_page 而包含
- None
- 新建页面
- None
这没有意义,我不是在任何行中将新页面的地址分配给索引的这个位置。
调试我现在可以看到
self.index[1] = Page() #Create new page
执行此新创建的页面已在索引中包含该错误值。
我不习惯 python(我是 Java 和 C 程序员),在我使用 python 完成第一个项目一段时间后,我假设 python处理内存,我不必太在意它。
我认为错误的发生是因为原始数组是空的,我正在向它分配一个 Page 对象,所以可能是我导致了内存问题。
这将在 C 中使用 reallocs 处理,但我不知道如何在 python 中解决这个问题,或者如果 python 中不需要此内存分配并且问题是不同的我不是看到了。
P.D。
根据要求,完整代码:
class Page:
index = [None] * 256 #One for each ascii character
is_word = False #If this is false, then is not an end word, just a passing index
def insert_word(self, word):
if(len(word) == 1): #Final condition
ascii_number_word = ord(word[0])
page_of_index = self.index[ascii_number_word]
if(page_of_index == None): #If the index is not present
page_of_index = self.index[ascii_number_word] = Page()
page_of_index.is_word = True #Mark page as word
else:
letter = word[0]
resulting_word = word[1:]
ascii_number_letter = ord(letter)
page_of_index = self.index[ascii_number_letter]
if(page_of_index == None): #index does not exist, then create
self.index[ascii_number_letter] = Page() #Create new page
page_of_index = self.index[ascii_number_letter]
page_of_index.insert_word(resulting_word)
那是因为在class级别定义的属性在Python中被认为是静态的。试试这个:
class Page:
def __init__(self):
self.index = [None] * 3
self.is_word = False
def create_middle_page(self):
self.index[1] = Page()
new_page = self.index[1]
print(new_page)
def __str__(self):
return str(self.index)
page = Page()
page.create_middle_page()
print(page)
输出:
[None, None, None]
[None, <__main__.Page object at 0x7f3bc6326fd0>, None]
在这里查看第 9.3.5 节:https://docs.python.org/3/tutorial/classes.html#class-and-instance-variables
来自上面的文档:
class Dog:
kind = 'canine' # class variable shared by all instances
def __init__(self, name):
self.name = name # instance variable unique to each instance
我遇到这个错误,我认为可能与内存有关。
我有一个 class Page()
class Page:
index = [None] * 3
is_word = False #If this is false, then is not an end word, just a passing index
页面用于构建动态结构,索引是指向其他页面的指针(或地址)数组。 最初这个地址是空的,只有在添加时它们才会包含另一个页面的地址。
如您所见,创建任何页面时,索引的所有值都为 none。
在我的代码的一部分中,我有这个:
self.index[1] = Page() #Create new page
new_page = self.index[1]
执行此代码后,初始页面 应包含在数组索引中:
- None
- 新建页面
- None
而new_page应该包含在数组索引中:
- None
- None
- None
问题是 new_page 而包含
- None
- 新建页面
- None
这没有意义,我不是在任何行中将新页面的地址分配给索引的这个位置。
调试我现在可以看到
self.index[1] = Page() #Create new page
执行此新创建的页面已在索引中包含该错误值。
我不习惯 python(我是 Java 和 C 程序员),在我使用 python 完成第一个项目一段时间后,我假设 python处理内存,我不必太在意它。
我认为错误的发生是因为原始数组是空的,我正在向它分配一个 Page 对象,所以可能是我导致了内存问题。 这将在 C 中使用 reallocs 处理,但我不知道如何在 python 中解决这个问题,或者如果 python 中不需要此内存分配并且问题是不同的我不是看到了。
P.D。 根据要求,完整代码:
class Page:
index = [None] * 256 #One for each ascii character
is_word = False #If this is false, then is not an end word, just a passing index
def insert_word(self, word):
if(len(word) == 1): #Final condition
ascii_number_word = ord(word[0])
page_of_index = self.index[ascii_number_word]
if(page_of_index == None): #If the index is not present
page_of_index = self.index[ascii_number_word] = Page()
page_of_index.is_word = True #Mark page as word
else:
letter = word[0]
resulting_word = word[1:]
ascii_number_letter = ord(letter)
page_of_index = self.index[ascii_number_letter]
if(page_of_index == None): #index does not exist, then create
self.index[ascii_number_letter] = Page() #Create new page
page_of_index = self.index[ascii_number_letter]
page_of_index.insert_word(resulting_word)
那是因为在class级别定义的属性在Python中被认为是静态的。试试这个:
class Page:
def __init__(self):
self.index = [None] * 3
self.is_word = False
def create_middle_page(self):
self.index[1] = Page()
new_page = self.index[1]
print(new_page)
def __str__(self):
return str(self.index)
page = Page()
page.create_middle_page()
print(page)
输出:
[None, None, None]
[None, <__main__.Page object at 0x7f3bc6326fd0>, None]
在这里查看第 9.3.5 节:https://docs.python.org/3/tutorial/classes.html#class-and-instance-variables
来自上面的文档:
class Dog:
kind = 'canine' # class variable shared by all instances
def __init__(self, name):
self.name = name # instance variable unique to each instance