Python 我需要帮助理解此代码中的意外依赖关系

Python 我需要帮助理解此代码中的意外依赖关系,python,dictionary,dependencies,Python,Dictionary,Dependencies,我创建了这个独立的示例来隔离我试图理解的行为: from pprint import pprint TRADES_CLOSED = dict() TRADES_ACTIVE = { '2010-01-08 12:00': [1, 'SHORT', 20000, '2010-01-08 12:00', 92.339], '2010-01-28 04:00': [2, 'LONG', 10000, '2010-01-28 04:00', 90.378], '2010-01-

我创建了这个独立的示例来隔离我试图理解的行为:

from pprint import pprint

TRADES_CLOSED = dict()
TRADES_ACTIVE = {
    '2010-01-08 12:00': [1, 'SHORT', 20000, '2010-01-08 12:00', 92.339],
    '2010-01-28 04:00': [2, 'LONG', 10000, '2010-01-28 04:00', 90.378],
    '2010-01-28 12:00': [3, 'SHORT', 10000, '2010-01-28 12:00', 89.824],
    '2010-01-29 04:00': [4, 'LONG', 20000, '2010-01-29 04:00', 90.164]}

TRADES_TEST = {k: TRADES_ACTIVE[k] for k in sorted(TRADES_ACTIVE)[-2:]}

pprint(TRADES_ACTIVE)
pprint(TRADES_TEST)

profit_long = TRADES_ACTIVE.pop([key for key, value in TRADES_TEST.items() if value[1] == "LONG"][0])
profit_long.extend(['2010-02-03 12:00', 91.278, 1464.54])

pprint(TRADES_ACTIVE)
pprint(TRADES_TEST)

TRADES_CLOSED[[key for key, value in TRADES_TEST.items() if value[1] == "LONG"][0]] = profit_long

pprint(TRADES_CLOSED)
我想对
TRADES\u ACTIVE
字典中的最后两个条目执行一些操作。因此,我创建了一个新的字典,名为
TRADES\u TEST
,它只包含
TRADES\u ACTIVE
中的最后两个条目

该代码生成以下输出:

{'2010-01-08 12:00': [1, 'SHORT', 20000, '2010-01-08 12:00', 92.339],
 '2010-01-28 04:00': [2, 'LONG', 10000, '2010-01-28 04:00', 90.378],
 '2010-01-28 12:00': [3, 'SHORT', 10000, '2010-01-28 12:00', 89.824],
 '2010-01-29 04:00': [4, 'LONG', 20000, '2010-01-29 04:00', 90.164]}
{'2010-01-28 12:00': [3, 'SHORT', 10000, '2010-01-28 12:00', 89.824],
 '2010-01-29 04:00': [4, 'LONG', 20000, '2010-01-29 04:00', 90.164]}
{'2010-01-08 12:00': [1, 'SHORT', 20000, '2010-01-08 12:00', 92.339],
 '2010-01-28 04:00': [2, 'LONG', 10000, '2010-01-28 04:00', 90.378],
 '2010-01-28 12:00': [3, 'SHORT', 10000, '2010-01-28 12:00', 89.824]}
{'2010-01-28 12:00': [3, 'SHORT', 10000, '2010-01-28 12:00', 89.824],
 '2010-01-29 04:00': [4,
                      'LONG',
                      20000,
                      '2010-01-29 04:00',
                      90.164,
                      '2010-02-03 12:00',
                      91.278,
                      1464.54]}
{'2010-01-29 04:00': [4,
                      'LONG',
                      20000,
                      '2010-01-29 04:00',
                      90.164,
                      '2010-02-03 12:00',
                      91.278,
                      1464.54]}
price\u long
列表是通过弹出
TRADES\u ACTIVE
的特定元素创建的。正如预期的那样,
TRADES\u ACTIVE
短一个元素。然后,
profit\u long
被三个新值扩展,并用作
TRADES\u CLOSED
字典中的条目


我不明白,为什么扩展
利润\u long
也会影响
交易测试。我盯着这段代码看了很长一段时间,我弄不懂它。对我来说,
profit\u long
TRADES\u TEST
是完全独立的实体。这是怎么可能的?

您的依赖性是由以下事实造成的:您的代码设置了一个名为
TRADES\u ACTIVE
的列表目录,然后将其中一些列表复制到另一个名为
TRADES\u TEST
的列表目录。但当您将一个列表分配给另一个变量时,该分配不会复制该列表;它只复制对它的引用。要看到这一点,在每次调用
pprint()
之后,在somedict.items()中为
k,v执行以下操作:print(k,id(v))
。这将显示每个列表的id。当我这样做的时候,这就是我所看到的。首先是守则:

print("TRADES ACTIVE 1")
pprint(TRADES_ACTIVE)
print("TRADES ACTIVE 1")
for k,v in TRADES_ACTIVE.items(): print (k, id(v))

print("TRADES TEST 1")
pprint(TRADES_TEST)
print("TRADES TEST 1")
for k,v in TRADES_TEST.items(): print (k, id(v))
然后输出:

TRADES ACTIVE 1
{'2010-01-08 12:00': [1, 'SHORT', 20000, '2010-01-08 12:00', 92.339],
 '2010-01-28 04:00': [2, 'LONG', 10000, '2010-01-28 04:00', 90.378],
 '2010-01-28 12:00': [3, 'SHORT', 10000, '2010-01-28 12:00', 89.824],
 '2010-01-29 04:00': [4, 'LONG', 20000, '2010-01-29 04:00', 90.164]}
TRADES ACTIVE 1
2010-01-08 12:00 2236442430536
2010-01-28 04:00 2236442430856
2010-01-28 12:00 2236442431048
2010-01-29 04:00 2236442431176
TRADES TEST 1
{'2010-01-28 12:00': [3, 'SHORT', 10000, '2010-01-28 12:00', 89.824],
 '2010-01-29 04:00': [4, 'LONG', 20000, '2010-01-29 04:00', 90.164]}
TRADES TEST 1
2010-01-28 12:00 2236442431048
2010-01-29 04:00 2236442431176
如您所见,两个dict中的匹配键指向同一个列表。注意,id 2236442431176在两个列表中都作为键“2010-01-29 04:00”的值递归

然后,您的代码将这些列表中的一个列表复制为
profit\u long
。这也指出现在中的同一列表,作为其他两个dict中的值

print("PROFIT_LONG")
print (id(profit_long))

PROFIT_LONG
2236442431176
当你改变这个列表(再次是ID2236442431176)时,这些变化在两个DICT中是可见的,因为所有三个变量都引用同一个列表

要解决此问题,在复制列表对象时,请复制列表,而不仅仅是对列表的引用。因此,与其

TRADES_TEST = {k: TRADES_ACTIVE[k] for k in sorted(TRADES_ACTIVE)[-2:]}

TRADES_TEST = {k: TRADES_ACTIVE[k][:] for k in sorted(TRADES_ACTIVE)[-2:]}