2017-03-28 135 views
0

我是一名网络工程师,尝试将Python编程学习为一项工作要求。Python变量赋值更改值

我写了下面

#Funtion此代码砍第一和最后一个项目在列表中

def chop(t): 
    t.pop(0) and t.pop(len(t)-1) 
    return t 

当我运行就行了t时的功能,并将其分配给一个变量一个。 a在函数执行后得到列表的其余部分,并且a成为一个新列表。这是完美的。

>>> t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
>>> a=chop(t) 
>>> a 
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
>>> 

后来当我尝试它工作得很好,但是a的值也变为打印印章(t)的输出,而我没有通过函数印章(t)的运行变量。有人能解释为什么会发生这种情况?

>>> print chop(t) 
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 
>>> a 
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 

问候 Umesh制作

+3

你不复制你的列表,所以'a'和't'指向同一个列表。如果你改变一个,他们都被改变了。 – khelwood

+0

你可能会发现这篇文章有用:[关于Python名称和值的事实和神话](http://nedbatchelder.com/text/names.html),这是由SO老将Ned Batchelder编写的。另请参阅[其他语言具有“变量”,Python具有“名称”](http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables)简短的总结与好的图表。 –

+0

你应该看看这个SO [文章](http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list) – latsha

回答

0

当调用斩(T),T被通过引用传递。所以当你执行“t.pop(0)和t.pop(len(t)-1)”操作时,它是在原始对象上完成的,而不是复制。

由于上述原因,下面是真实的,以及

>>> t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
>>> chop(t) 
>>> t 
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
>>> 
1

要保存未修改的列表t,通过a = t[:]创建它的副本,并在列表a

>>> t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
>>> a=t[:] 
>>> a.pop(0) 
'a' 
>>> a 
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] 
>>> t 
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] 
>>> 
+0

而不是'a = t [:]; a.pop(0)'做'a = t [1:]'更有效率。从列表开始弹出时,所有后续列表项都必须向下移动。这发生在C速度,所以它相对较快,但如果可以的话,最好避免它。 –

0
t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
def chop(t): 
    t.pop(0) and t.pop(len(t)-1) 
    return t 
a=chop(t) 
测试斩

在python中,Assignment从不复制数据。 通过执行a=chop(t)就像将变量中的函数引用存储一样。因此,我们每次调用a时,都会得到chop()函数执行。