我注意到一个非常奇怪的行为,当使用python将2个变量绑定到相同的变量时,我想知道是否有人对此行为有解释,并且是否有比我的更好的解决方案它
例如,我有一个名为schema1的数组。我后来需要使用一组新的变量来扩展schema1,但是我不能搞乱原始数组,所以我通过设置schema2来创建schema2,就像这样:
from someFileICreated import SomeClass
schema1 = SomeClass.SomeSchema
假设schema1有数组[a,b,c],那么我:
schema2 = schema1
schema2.append(d, e, f)
现在,schema2应该有[a,b,c,d,e,f] 但是,由于某种原因,schema1也有[a,b,c,d,e,f]
我不明白这种行为,所以如果你有一个很好的解释。就解决方案而言,这将有效,但我想知道是否有更好的方法可以避免循环。
我只是这样做而不是设置schema2 = schema1:
schema2 = []
for x in schema1:
schema2.append(x)
答案 0 :(得分:1)
重要的是要记住,在Python中,变量不是容纳东西的小盒子,它们只是附加到东西的方便名称。
所以当你这样做时
schema1 = SomeClass.SomeSchema
schema2 = schema1
您只是将两个名称附加到同一条数据中,这就是两个变量的值都会发生变化的原因。
您需要复制实际值。对于列表,一种方法是:
schema2 = schema1[:]
有关复制列表的详情,请参阅this question。
答案 1 :(得分:0)
在这一行:
schema2 = schema1
您没有创建新数组,而是将参考schema2
设置为指向{strong>相同数组schema1
指着。
书写
schema2 = schema1[:]
实际上会通过复制 schema1
创建一个新列表。
答案 2 :(得分:0)
上面的答案都是正确的,而不是做schema1 [:] 你可以做到
from copy import copy
schema2 = copy(scheme1)
使其更具可读性,并且可以与其他对象(如dict
)一起使用答案 3 :(得分:0)
将对象分配给变量时,将该名称绑定到该对象。如果然后将该变量设置为另一个变量,则第二个变量名称将绑定到原始对象。
schema1 = SomeClass.someSchema
schema2 = schema1
在此示例中,schema1和schema2绑定到同一对象。您可以使用python copy
库,或者如果您正在使用的类接受该类的对象作为构造函数中的参数,则可以通过该方式创建新对象。例如,如果您要复制词典,则可以执行以下操作:
from copy import copy
schema1 = { 'foo': 'bar' }
schema2 = copy(schema1)
或
schema1 = { 'foo' : 'bar' }
schema2 = dict(schema1)
在python的执行模型中讨论了名称绑定。 https://docs.python.org/3/reference/executionmodel.html
如果您想了解更多信息,这可能是一个良好的开端:https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/