Python中数组初始化的奇怪行为
下面是我编写的Python程序的一个片段,用于向智能卡发送APDU命令。我在这个程序中使用了PySCard库 第一个方案:Python中数组初始化的奇怪行为,python,python-2.7,Python,Python 2.7,下面是我编写的Python程序的一个片段,用于向智能卡发送APDU命令。我在这个程序中使用了PySCard库 第一个方案: for LOAD_KEY in validLoadCommands: data,sw1,sw2 =connection.transmit(LOAD_KEY) temp = LOAD_KEY x= temp[3] for j in range(0,len(LOAD_KEY)): LOAD_KEY[j]=hex(LOAD_KEY[
for LOAD_KEY in validLoadCommands:
data,sw1,sw2 =connection.transmit(LOAD_KEY)
temp = LOAD_KEY
x= temp[3]
for j in range(0,len(LOAD_KEY)):
LOAD_KEY[j]=hex(LOAD_KEY[j])
print ' >>>',' Load Command :',
for j in range(0,len(LOAD_KEY)):
LOAD_KEY[j]=str(LOAD_KEY[j])
if len(LOAD_KEY[j])==3:
LOAD_KEY[j]=LOAD_KEY[j][0:2]+'0'+LOAD_KEY[j][2]
print LOAD_KEY[j],
print
for j in range(0,len(data)):
data[j]=hex(data[j])
print ' <<<',' Data :',
for j in range(0,len(data)):
data[j]=str(data[j])
if len(data[j])==3:
data[j]=data[j][0:2]+'0'+data[j][2]
print data[j],
print '--',hex(sw1),hex(sw2)
if (temp[2] == 0x00 or temp[2] == 0x20):
keyType = 0x60
else:
keyType = 0x61
AUTH = [0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, blockNum, keyType,temp[3]]
print 'AUTH Command: ', AUTH
data,sw1,sw2 =connection.transmit(AUTH)
print data, sw1, sw2
那么输出是:
AUTH: [255, 134, 0, 0, 5, 1, 0, 4, 97, 14]
[] 144 0
如上所述,在第二种情况下,我没有收到任何错误,而第一个程序和第二个程序之间没有区别!我只是换了
AUTH = [0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, blockNum, keyType,temp[3]]
与:
而x
是用程序顶部的temp[3]
初始化的。在初始化行和错误行之间,x
和temp[3]
都没有改变
这是怎么回事?您的
temp
变量引用LOAD\u KEY
(第3行:temp=LOAD\u KEY
)
当调用x=temp[3]
时,设置的是连接后索引3处的LOAD\u键的值
当您为您的AUTH
发送temp[3]
时,LOAD\u键
已更改,temp[3]
。因此它不再是与x
相同的值
connection.transmit => LOAD_KEY is set => temp => [3] => x
*** LOAD_KEY changes ***
x => old value of temp[3] aka LOAD_KEY[3]
temp[3] => whatever your code have put in it
编辑:简短示例
>>> LOAD_KEY = ['one', 'two', 'three', 'four']
>>> temp = LOAD_KEY
>>> x = temp[3]
>>> LOAD_KEY[3] = 'new value'
>>>
>>> LOAD_KEY[3]
'new value'
>>> temp[3]
'new value'
>>> x
'four'
您的temp
变量引用LOAD\u KEY
(第3行:temp=LOAD\u KEY
)
当调用x=temp[3]
时,设置的是连接后索引3处的LOAD\u键的值
当您为您的AUTH
发送temp[3]
时,LOAD\u键
已更改,temp[3]
。因此它不再是与x
相同的值
connection.transmit => LOAD_KEY is set => temp => [3] => x
*** LOAD_KEY changes ***
x => old value of temp[3] aka LOAD_KEY[3]
temp[3] => whatever your code have put in it
编辑:简短示例
>>> LOAD_KEY = ['one', 'two', 'three', 'four']
>>> temp = LOAD_KEY
>>> x = temp[3]
>>> LOAD_KEY[3] = 'new value'
>>>
>>> LOAD_KEY[3]
'new value'
>>> temp[3]
'new value'
>>> x
'four'
在第一个示例中,temp[3]
是一个字符串('0x0e'
)
在第二个示例中,x
是一个整数(14
)
这是因为您正在使用以下行将LOAD\u键的整数值转换为十六进制字符串:
LOAD_KEY[j] = hex(LOAD_KEY[j])
要将十六进制表示的字符串转换为整数,请使用内置类型的第二个参数将基数设置为16:
>>> int('0x0e', 16)
14
在第一个示例中,temp[3]
是一个字符串('0x0e'
)
在第二个示例中,x
是一个整数(14
)
这是因为您正在使用以下行将LOAD\u键的整数值转换为十六进制字符串:
LOAD_KEY[j] = hex(LOAD_KEY[j])
要将十六进制表示的字符串转换为整数,请使用内置类型的第二个参数将基数设置为16:
>>> int('0x0e', 16)
14
您也是对的,可能第9行的错误是加载键[j]=str(加载键[j])
到字符串的转换早于--LOAD键[j]=hex(加载键[j])
。转换似乎完全是多余的。你也是对的,可能是第9行的一个错误LOAD\u KEY[j]=str(LOAD\u KEY[j])
到字符串的转换早于此--LOAD\u KEY[j]=hex(LOAD\u KEY[j])
。转换似乎完全是多余的。为什么要将整数列表转换为字符串列表?它似乎只会让你头痛。例如,在测试字符串和int之间的相等性时,if语句总是会失败。如果确实要创建用于打印的字符串,则只在需要打印时转换它们(并且不修改列表)<代码>“0x{:0>2x}”。格式(10)
生成“0x0a”
。大括号之间的位是数字的格式说明符。冒号表示谈论如何格式化参数0>2
将右侧的数字对齐,至少用零填充两个字符(如果需要)。x
表示将数字格式化为十六进制。@Dunes当我在程序中更改LOAD\u键时,temp
的值是否也会更改?是。因为LOAD_KEY
和temp
在内存中是同一个列表对象。也许您希望temp
成为LOAD\u KEY
的副本。使用temp=list(LOAD_KEY)
或temp=LOAD_KEY[:]
创建副本。@Dunes您的评论必须用金色书写!:)这些真的很有用。谢谢。为什么要将整数列表转换为字符串列表?它似乎只会让你头痛。例如,在测试字符串和int之间的相等性时,if语句总是会失败。如果确实要创建用于打印的字符串,则只在需要打印时转换它们(并且不修改列表)<代码>“0x{:0>2x}”。格式(10)
生成“0x0a”
。大括号之间的位是数字的格式说明符。冒号表示谈论如何格式化参数0>2
将右侧的数字对齐,至少用零填充两个字符(如果需要)。x
表示将数字格式化为十六进制。@Dunes当我在程序中更改LOAD\u键时,temp
的值是否也会更改?是。因为LOAD_KEY
和temp
在内存中是同一个列表对象。也许您希望temp
成为LOAD\u KEY
的副本。使用temp=list(LOAD_KEY)
或temp=LOAD_KEY[:]
创建副本。@Dunes您的评论必须用金色书写!:)这些真的很有用。谢谢你。你的temp
变量引用LOAD\u KEY
(第3行:temp=LOAD\u KEY
)所以当我更改LOAD\u KEY
,temp的值也会更改?在x=temp[3]
行中x
变量引用temp[3]
。因此,当我更改LOAD\u KEY
时,temp
的值将自动更改,当temp
更改时,temp[3]
和x
变量的值将自动更改,对吗?请参阅我的编辑以获得一个可理解(希望)的示例。您的temp
变量引用LOAD\u KEY>(第3行:temp=