Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python bytearray()索引赋值_Python_Bytearray - Fatal编程技术网

Python bytearray()索引赋值

Python bytearray()索引赋值,python,bytearray,Python,Bytearray,请容忍我在这里;我是系统管理员,不是开发人员。下面的代码对我来说很好。但是当我把它分成两个文件,这样类在一个文件中,逻辑在另一个文件中,我得到一个错误,数据[0]是str,不支持赋值 分条工作示例 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") ret

请容忍我在这里;我是系统管理员,不是开发人员。下面的代码对我来说很好。但是当我把它分成两个文件,这样类在一个文件中,逻辑在另一个文件中,我得到一个错误,数据[0]是str,不支持赋值

分条工作示例

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

您不能更改Python字符串,因为它们是不可变的。您可以找到很多关于错误的注释“'str'对象不支持项赋值”。我不知道如果你把它合并到一个文件中,它是如何工作的。

我想这就是正在发生的事情。当您调用:

part1.load(mbr[446:462])
self.data
正在被分配一个字符串。在这一点上,
self.data
是一个字符串,而不是一个字节数组。所以当你这么做的时候

part1.boot_flag(b"\xff")
它正确地抱怨
TypeError:“str”对象不支持项目分配

这就是我的意思:

>>> data_one = "My name is shaktimaan"
>>> data_two = data_one[5:10]
>>> type(data_one)
<type 'str'>
>>data\u one=“我的名字叫沙克蒂曼”
>>>数据二=数据一[5:10]
>>>类型(数据类型)
在第一种情况下,没有调用
load
,因此
self.data
仍然是一个字节数组(在调用构造函数之后)。因此,您的
boot_标志
可以毫无怨言地按预期工作


我想您需要修复
load
中的代码,以便将字节数组分配给
self.data

我想我的问题的根源是为什么bytearray索引由字符串表示。bytearray对象应该是可变的,单个元素应该是整数。因此,请使用bytearray而不是b“”<代码>b=字节数组('\xff');b[0]='\xee'
>>> data_one = "My name is shaktimaan"
>>> data_two = data_one[5:10]
>>> type(data_one)
<type 'str'>