参考和价值影响:当Python执行第一个和SECODN时



我想理解何时精确地python逐个值和何时通过参考影响变量。

举以下示例。在此代码中,我首先创建一个" datatotreat"列表,然后说" datatotreatbis = datatotreat"。但是,当我更改datatotreatbis时,datatotreat不会受到影响。

但是,在代码的第二部分中,我做同样的事情,但是我更改了数组datatotreatbis的元素:datatotreatbis [0]。然后datatotreat也更改。

我怎么能猜到?在这两种情况下,我都可以使用列表,而当我更改列表元素时,事物是通过参考而不是通过新价值影响来工作的。

我只是想了解正在发生的事情:为什么在第一个情况下,我确实复制了变量,但是在第二种情况下,我只是更改参考。

dataToTreat=[]
for i in (np.arange(5)):
    dataToTreat.append(i)
dataToTreatBis=dataToTreat
print(dataToTreat)
dataToTreatBis=[10,11,12,13,14]
print(dataToTreat) # dataToTreat hasn't changed because of dataToTreatBis
print(" ")
dataToTreat=[]
#data[NdemodB + NdemodA:NdemodB + NdemodA+NtraceA+NtraceB]
for i in range(5):
    dataToTreat.append([0, 1, 2])
dataToTreatBis=dataToTreat
print(dataToTreat[0])
dataToTreatBis[0]=[10,11,12,13,14]
print(dataToTreat[0]) # dataToTreat has changed here !

所有python变量均与内存中的某些对象结合。

在第一部分中:

import numpy as np
dataToTreat=[]
for i in (np.arange(5)):
    dataToTreat.append(i)
dataToTreatBis=dataToTreat
print(dataToTreat)
dataToTreatBis=[10,11,12,13,14]
print 'dataToTreatBis_id: ', id(dataToTreatBis)
print(dataToTreat) # dataToTreat hasn't changed because of dataToTreatBis
print 'dataToTreat_id: ', id(dataToTreat)

输出:

datatotreatbis_id:85586968

datatotreat_id:85586648

在第二部分中: 由于您定义了一个新的分配操作员(即dataToTreat=[]),因此您实际上创建了一个具有新ID的新对象。

dataToTreat=[]
#data[NdemodB + NdemodA:NdemodB + NdemodA+NtraceA+NtraceB]
for i in (np.arange(5)):
    dataToTreat.append([0, 1, 2])
dataToTreatBis=dataToTreat

print(dataToTreat[0])
dataToTreatBis[0]=[10,11,12,13,14]
print(dataToTreat[0]) # dataToTreat has changed here !
print id(dataToTreatBis)
print id(dataToTreat)
print 'dataToTreatBis_id: ', id(dataToTreatBis)
print 'dataToTreat_id: ', id(dataToTreat)

输出:

datatotreatbis_id:85586888

datatotreat_id:85586888

如您所见,您正在存储器上的同一位置编写,这就是Datatotreat正在更改的原因!

两次,datatotreatbis都引用了datatotreat。但是,首先,您要进行另一个分配(完全重写)Datatotreatbis,这会打破链接。在第二个实例中,您只是在一个元素中修改值,因此不会打破链接。希望这很清楚!

最新更新