Python bytearray() 索引赋值

1 投票
2 回答
11408 浏览
提问于 2025-04-18 03:13

请耐心听我说;我是一名系统管理员,不是开发者。以下代码对我来说运行得很好。但是当我把它分成两个文件时,一个文件放类,另一个文件放逻辑,我就遇到了一个错误,提示data[0]是一个字符串,不能进行赋值。

这是一个简化的工作示例:

class partition:
    def __init__(self):
        self.data = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
        return

    def boot_flag(self, value=None):
        if value is not None:
            self.data[0] = value
            return
        else:
            return self.data[0:1][::-1]


part1 = partition()
print str(part1.data).encode('hex')
value = b"\xff"
part1.boot_flag(value)
print str(part1.data).encode('hex')

这是目前完整的类。

class partition:
    def __init__(self):
        self.data = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")

    def boot_flag(self, value=None):
        if value is not None:
            self.data[0] = value
            return
        else:
            return self.data[0:1][::-1]

    def start_chs(self, value=None):
        if value is not None:
            self.data[1:4] = value
            return
        else:
            return self.data[1:4][::-1]

    def type(self, value=None):
        if value is not None:
            self.data[4:5] = value
            return
        else:
            return self.data[4:5][::-1]

    def end_chs(self, value=None):
        if value is not None:
            self.data[5:8] = value
        else:
            return self.data[5:8][::-1]

    def start_lba(self, value=None):
        if value is not None:
            self.data[8:12] = value
        else:
            return self.data[8:12][::-1]

    def sectors(self, value=None):
        if value is not None:
            self.data[12:16] = value
        else:
            return self.data[12:16][::-1]

    def load(self, data):
        self.data = data
        return

这是我用来测试这个类的测试工具。

import dospart
disk = open('/dev/sda', 'rb')
mbr = disk.read(512)
part1 = dospart.partition()
part1.load(mbr[446:462])
print str(part1.data).encode('hex')
part1.boot_flag(b"\xff")
print str(part1.data).encode('hex')

这是错误信息:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    part1.boot_flag(b"\xff")
  File "/Users/digitaladdictions/PycharmProjects/dospart/dospart.py", line 9, in boot_flag
    self.data[0] = value
TypeError: 'str' object does not support item assignment

注意,我可以正常读取这些值。只有在我尝试写入self.data[]时才会出现错误。

[更新]

根据被接受的答案,这是我新的加载函数,现在可以正常工作。

def load(self, data):
    part = bytearray(data)
    self.data = part
    return

2 个回答

0

在Python中,字符串是不能直接修改的,这种特性叫做“不可变”。你可能会看到很多关于这个错误的信息,错误提示是“'str'对象不支持项赋值”。我不太明白如果把这些代码放在一个文件里,怎么能正常工作。

2

我觉得事情是这样的。当你调用:

part1.load(mbr[446:462])

self.data 被赋值为一个字符串。从那时起,self.data 就变成了一个字符串,而不是字节数组。所以当你执行

part1.boot_flag(b"\xff")

时,它就会正确地报错 TypeError: 'str' object does not support item assignment

我说的意思是:

>>> data_one = "My name is shaktimaan"
>>> data_two = data_one[5:10]
>>> type(data_one)
<type 'str'>

在你的第一个例子中,没有调用 load,因此 self.data 仍然是一个字节数组(在调用构造函数之后)。所以你的 boot_flag 按预期工作,没有报错。

我觉得你需要修正 load 中的代码,把字节数组赋值给 self.data

撰写回答