设置相等时,Python会更改两个变量吗?

时间:2016-06-03 14:24:52

标签: python variables

我注意到一个非常奇怪的行为,当使用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)

4 个答案:

答案 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/