Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
引用和值装模作样:python何时做第一个,何时做第二个_Python - Fatal编程技术网

引用和值装模作样:python何时做第一个,何时做第二个

引用和值装模作样:python何时做第一个,何时做第二个,python,Python,我想了解python何时通过值影响变量,何时通过引用影响变量 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

我想了解python何时通过值影响变量,何时通过引用影响变量

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 !
以下面的例子为例。在这段代码中,我首先创建一个列表“dataToTreat”,然后说“dataToTreatBis=dataToTreat”。但当我将dataToTreatBis更改为dataToTreat时,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 !

这两次,dataToTreatBis都是对dataToTreat的引用。然而,在第一个实例中,您正在对reatbis执行另一个赋值(完全重写)数据,这会中断链接。在第二个例子中,您只是修改一个元素中的值,因此并没有破坏链接。希望这是清楚的

所有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正在更改

您误解了Python变量是什么。理解可变对象也很重要<代码>=可以做两件事-更改名称引用的对象,以及更改可变对象的内容。