python函数中传入list为啥会这样?,这破问题卡了一整天

#--------------------------
def test( inputlist ):
A,B = inputlist,inputlist
print A
print B
print "----"
A[0] += 5

print A
print B

test( [5.0 , 6.1] )
#--------------------------
我想要的输出结果是
[5.0, 6.1]
[5.0, 6.1]
----
[10.0, 6.1]
[5.0, 6.1]
实际输出结果为
[5.0, 6.1]
[5.0, 6.1]
----
[10.0, 6.1]
[10.0, 6.1]

为什么两个变量一起变了?怎么办?那么该怎么写?

代码及运行结果如图:

从你的问题来看是一个新手,建议直接放弃2.x版本学习3.x版本。对现在的你来说用到的2与3版本之间的差异可能也就是print(如图中所示与你代码的差异),影响很小。

代码解释:

你的代码中用A,B = inputlist,inputlist进行赋值,实际A与B都是指向了同一个内存对象,所以对其中任意一个做出修改,即修改了内存中的这个对象,造成A与B同时修改。解决方法,引入copy模块中的deepcopy()函数,保证A与B指向长的一样但在内存中是两个对象,这样对其中一个修改时完全不影响到另一个。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-08-11

python内部的引用机制. 简单来说, 如果你把列表传入函数, 函数会进行"就地操作", 即直接修改列表, 因为复制一份的代价较高, 如例一. 如果你确实不想修改, 使用copy函数, 如例二.

另外, 你学习的是python2, 已经被官方停止支持了, 请找一本python3.5以上的来学习, 否则有一天你会发现学了一堆没用的东西.

第2个回答  2020-08-11
代码的第二句话相当于把那个inputlist的实例同时赋给了a跟b,相当于a,b指向的都是inputlist,然后改变a的第一个元素值的时候,本质上改变的是inputlist的第一个值,哦,AB又是指向他的,所以打印出来AB的值是改变后的inputlist。
第3个回答  2020-08-11
cclxpp123已经阐述过原理了。我在python 3上的输入如下:B是使用切片,或列表副本

>>> def test(inputlist):
... A=inputlist
... B=inputlist[:]
... print(A)
... print(B)
... print("---------")
... A[0]+=5
... print(A)
... print(B)
...
>>> test([5.0,6.1])
[5.0, 6.1]
[5.0, 6.1]
---------
[10.0, 6.1]
[5.0, 6.1]
>>>