Python中数组初始化的奇怪行为

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[

下面是我编写的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[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=