为什么函数外部的列表会被另一个函数内部的内容修改?(Python 3.4)

为什么函数外部的列表会被另一个函数内部的内容修改?(Python 3.4),python,python-3.x,Python,Python 3.x,我是一个相对的python新手。这里有一个简单的函数,它接收列表并删除列表中的一个元素。但是,我注意到函数实际上改变了函数外部的列表。比如说, 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],正如预期的那样,但是第二

我是一个相对的python新手。这里有一个简单的函数,它接收列表并删除列表中的一个元素。但是,我注意到函数实际上改变了函数外部的列表。比如说,

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)
将从
a
lista
中删除元素
1


谢谢

Python对象通过对象引用传递给函数(Ruby调用此PASS,但与C++通过引用不同)。这意味着您分配给
lista
的参数是原始对象
a
,只是将一个新的命名引用对象添加到相同的数据中

如果改为复制列表,则不会影响原始列表

x = test(lista=list(a))

lista
只是传递的参数的另一个名称。也就是说,
lista
只是
a
的同义词。它们是同一个对象。您传入了一个列表,然后对其进行了修改。。。这很直截了当。如果您想保留原始列表,请为该函数制作一份副本。让一个函数覆盖您传入的列表而不是返回一个新的列表是一个好主意吗?我建议阅读Ned Batchelder的。这是对这类东西如何工作的最好解释之一。“Python对象通过引用传递给函数”-而传递给函数的是引用,“通过引用传递”指的是一个特定的、不同的参数传递模型。在“按引用传递”中,
lista
将是调用方变量的别名,而不是引用共享对象的两个变量,对
lista
的赋值将影响调用方变量。@user2357112我对术语有点宽泛,因为Ruby为同一操作调用了“按引用传递”。我进行了更新,以澄清它与传统的传递引用不完全相同。您有Ruby调用此传递引用的源代码吗?当我在google
Ruby中通过引用传递时,我没有收到任何消息称它为通过引用传递。最接近的是“传递值,其中值是一个引用”,就像Java人员所说的那样。Ruby编程语言将其称为“参数是通过值而不是引用传递的,但是传递的值是对象引用”。所有3个来源都指出,通过引用是一个令人困惑的术语,它不能很好地从C++到Ruby(和推论Python)对象的翻译模型。