我正在编写一个堆栈类MyStack
,作为列表实现,其中每个元素都是一个包含两个字段('a'
和'b'
)的字典。这些字典字段中的每一个本身都是一个列表(在push()
中初始化为空列表)。除了push()
和pop()
(后者为了可读性而跳过了),我打算将add
元素添加到堆栈顶部元素的这些列表(字典字段)中(index { {1}})。
问题是值被添加到两个字典字段中,而不仅仅是所选字段。但是,我使用独立变量[-1]
对此进行测试,我测试的变量与对象standalone_stack
的{{1}}变量相同。令人惊讶的是,我得到了我想要的东西 - 我只追加到选定的字段。这是代码:
stack
我的Python 2.7.6输出如下:
MyStack
我需要帮助的是:
class MyStack(object):
def __init__(self):
self.stack = []
def push(self):
self.stack.append(dict.fromkeys(['a', 'b'], []))
def add(self, field, value):
self.stack[-1][field].append(value)
def __str__(self):
return str(self.stack)
def lists_the_same(list1, list2):
if list1 == list2:
print 'Yes, the same'
else:
print 'No, not the same'
# Create essentially the same data in two different ways:
ms = MyStack()
standalone_stack = [{'a': [], 'b': []}]
ms.push()
print ms
print standalone_stack
lists_the_same(ms.stack, standalone_stack)
# Now modify both:
field = 'a'
value = 2
ms.add(field=field, value=value)
standalone_stack[-1][field].append(value)
print ms
print standalone_stack
lists_the_same(ms.stack, standalone_stack)
)或独立变量[{'a': [], 'b': []}]
[{'a': [], 'b': []}]
Yes, the same
[{'a': [2], 'b': [2]}]
[{'a': [2], 'b': []}]
No, not the same
的字段时,为什么会出现这种奇怪的行为差异?即使指出Python相关的关键字也会有所帮助,因为我已经有一段时间不能谷歌了。