Python 当我把一个列表放入一个函数中时,列表是否发生了变化?参数不是全局的,它是否应该保持不变?

Python 当我把一个列表放入一个函数中时,列表是否发生了变化?参数不是全局的,它是否应该保持不变?,python,python-3.x,Python,Python 3.x,根据我的教科书,在Python中,所有参数的行为都类似于局部变量,它们的效果就像是通过值传递一样。因此,我的代码中的b在传入类似a的函数后是否应该保持不变 我希望b在最后是[0,0,0,0,0]。在将列表“x”的第一个元素指定给1之前,可以复制它 >>> def B(x): ... x[0] = 1 ... print(x) ... >>> x = [0, 0, 0, 0] >>> B(x) [1, 0, 0, 0] >

根据我的教科书,在Python中,所有参数的行为都类似于局部变量,它们的效果就像是通过值传递一样。因此,我的代码中的
b
在传入类似
a
的函数后是否应该保持不变


我希望
b
在最后是
[0,0,0,0,0]

在将列表“x”的第一个元素指定给1之前,可以复制它

>>> def B(x):
...     x[0] = 1
...     print(x)
...
>>> x = [0, 0, 0, 0]
>>> B(x)
[1, 0, 0, 0]
>>> x
[1, 0, 0, 0]
>>>
>>> def B2(x):
...     x = x.copy()
...     x[0] = 1
...     print(x)
...
>>> x = [0, 0, 0, 0]
>>> B2(x)
[1, 0, 0, 0]
>>> x
[0, 0, 0, 0]
因为python参数是通过对象引用传递的,并且list是一个可变对象,所以一旦您将list传递到函数中并更改其元素,原始的list也将更改

但是,如果在赋值之前使用“x=x.copy()”,则“x”将与原始对象不同,因此对函数中“x”的任何更改都不会影响主作用域中的“x”

def A(x):
    x = 10
    print (x)

a= 2
A(a) # 10
print(a) # 2 a is still referring to the same object


def B(x):
    x[0] = 1
    print (x)

b = [0,0,0,0,0]
B(b) # [1, 0, 0, 0, 0]
print (b) # [1, 0, 0, 0, 0] b changed!
传递不可变对象

变量
a
引用值为2的对象。 当我们将
a
传递给
a(x)
时,函数将局部变量
x
引用到同一对象。 由于integer是不可变的,根据定义,我们不能将objects值修改为10,变量a始终继续引用值为2的对象,这就解释了为什么调用后a的值没有改变

注意:我们仍然可以通过捕获函数的返回来“修改”不可变对象

通过将函数的
return
值指定给a,我们重新指定了a,以引用函数中创建的值为10的新对象。注意,最初提到的对象a永远不会改变-它仍然是2-但是通过有一个指向函数创建的新对象的点,我们可以“修改”a的值

传递可变对象

当我们传递可变对象时,
B(B)
函数会生成不同的结果

代码
b=[0,0,0,0,0]
具有变量
b
引用列表对象,其中包含对三个不可变对象的引用:整数0、0、0和0

通常,当我们将
b
传递给
b()
时,函数中的局部变量
x
引用与
b
相同的对象。
x[0]=1
修改列表,因为列表是可变的。
由于没有创建新对象,并且对象的位置发生了更改,因此当我们打印b时,我们会得到修改列表。

您的教科书可能重复的内容是错误的;Python中的参数是通过对象引用传递的。@jonrsharpe该语句在技术上是不正确的。在python中,参数是通过赋值传递的。(就按值/引用而言,它们实际上是按值传递的,但问题是所有python变量都可以被视为1级指针。但我们不应该在python中真正讨论它们)@Paritossing同样的事情,对象引用就是您引用的值,但它很容易被不熟悉细节的人误解,我发现在介绍python参数时,只讨论传递赋值更容易?所以x和b现在引用同一个列表,并且由于列表中的第0个元素被代码x[0]=1更改,所以b也被更改了?在A(x)的开头,A首先被分配给x,现在两者都指整数2;因为代码x=10只改变了x,所以a保持不变?我试过代码。。。抱歉,我不知道如何在注释中正确键入代码..>>def C(x):x=[0,0,0,0]print(x)>>>C=[1,1,1]>>>C(C)[0,0,0]>>C[1,1,1,1]现在似乎很清楚,尝试更改函数C中的x[0],您将看到差异
def A(x):
    x = 10
    return (x)

a= 2
a = A(a)
print(a) # 10 a now refers to the new object created by the function