2016-02-27 96 views
0

我是一个相对的python新手。我在这里有一个简单的函数,它接受一个列表并删除列表中的一个元素。但是,我注意到函数实际上改变了函数外部的列表。例如,为什么函数外部的列表会被另一个函数内部的内容修改? (Python 3.4)

def test(lista): 
    lista.remove(1) 
    return(lista) 

def main(): 
    a = [1,2,3] 

    print(a) 

    x = test(lista=a) 

    print(a) 

事实证明,以print(a)第一个电话,我得到[1, 2, 3]如预期,但print(a)了第二个电话,我得到[2, 3]这并不完全意义的我,因为我不是肯定为什么功能test会从a中删除元素。我知道我通过a作为参数,但我不确定为什么lista.remove(1)会从alista中删除元素1

谢谢!

+0

'lista'是传递参数的另一个名称。也就是说,'lista'只是'a'的同义词。他们是同一个对象。 – zondo

+1

你通过了一个列表,然后修改它......它非常简单。如果您想保留原始列表,请为该功能制作副本。 – tdelaney

+0

有一个函数可以覆盖你传入的列表而不是返回一个新函数,这是一个好主意吗? –

回答

0

Python对象通过对象引用传递给函数(ruby调用此引用传递,但它不同于C++传递引用)。这意味着您分配给lista的参数是原始对象a,只需对相同数据使用新的命名引用对象即可。

如果复制而不是名单不会影响原有的

x = test(lista=list(a)) 
+2

“Python对象通过引用传递给函数” - 虽然传递给函数的东西是引用,但“引用传递”是指特定的,不同的参数传递模型。在传递引用中,'lista'将是调用者变量的别名,而不是两个引用共享对象的变量,而对'lista'的赋值会影响调用者的变量。 – user2357112

+0

@ user2357112作为Ruby称之为相同操作的引用传递的术语,我当时有点自由自在。我进行了更新,以澄清它与传统的参照传递不太一样。 – Pyrce

+0

您是否有Ruby的源代码通过引用调用此传递?当我通过引用通过'Ruby传递'的时候,我得到了零个来源,称它通过引用传递。最接近的是“通过值传递值,其中的值是一个引用”,就像Java家伙所说的那样。 – user2357112

相关问题