Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数内部变量的赋值更改函数外部的赋值-Python_Python_Function_Variables_Scope - Fatal编程技术网

函数内部变量的赋值更改函数外部的赋值-Python

函数内部变量的赋值更改函数外部的赋值-Python,python,function,variables,scope,Python,Function,Variables,Scope,我从使用Matlab转到了Python,使用函数时的变量赋值让我感到困惑 我有一个代码如下: a = [1,1,1] def keeps(x): y = x[:] y[1] = 2 return y def changes(x): y = x y[1] = 2 return y aout = keeps(a) print(a, aout) aout = changes(a) print(a, aout) 第一个print语句给出[1,1,

我从使用Matlab转到了Python,使用函数时的变量赋值让我感到困惑

我有一个代码如下:

a = [1,1,1]

def keeps(x):
    y = x[:]
    y[1] = 2
    return y

def changes(x):
    y = x
    y[1] = 2
    return y

aout = keeps(a)
print(a, aout)

aout = changes(a)
print(a, aout)
第一个print语句给出
[1,1,1][1,2,1]
,而

第二个给出了
[1,2,1][1,2,1]

我的理解是(来自Matlab)函数中变量的操作是局部的。但是在这里,如果我不在函数内部复制变量,那么函数外部的值也会改变。这几乎就像变量被定义为
global


如果有人能够解释变量在这两种方法中的分配方式是如何不同的,那么这将非常有帮助。如果有人希望向函数发送变量而不影响函数外部的值,那么最好的做法是什么?谢谢。

参数传递是通过赋值完成的。在
更改中
,隐式发生的第一件事是
x=a
当您调用
时,更改(a)
。由于助理从不复制数据,因此您会变异
a

keeps
中,您没有变异参数列表,因为
x[:]
正在创建一个(浅层)副本,然后将名称
y
分配给该副本


我强烈建议观看。

参数传递是通过赋值完成的。在
更改中
,隐式发生的第一件事是
x=a
当您调用
时,更改(a)
。由于助理从不复制数据,因此您会变异
a

keeps
中,您没有变异参数列表,因为
x[:]
正在创建一个(浅层)副本,然后将名称
y
分配给该副本


我强烈建议您观看。

让我们看看您的代码,但首先,我们将在顶部设置函数声明的模式,以便执行顺序更加清晰

def keeps(x):
    y = x[:]  #Here you are creating a modifiable copy of the original x list and referencing it with y
    y[1] = 2
    return y

def changes(x):
    y = x  # Here you are just referencing x itself with a new name y
    y[1] = 2
    return y

a = [1,1,1]

aout = keeps(a)
print(a, aout)

aout = changes(a)
print(a, aout)

基本上,如果您只是将另一个变量名分配给一个列表,那么您将为同一个对象指定两个名称,因此内容中的任何更改都可能影响两个“列表”。当您使用
y=x[:]
时,实际上是在内存中通过列表切片创建
x
列表的新副本,并将新变量名
y
分配给该列表的新副本。

让我们看看您的代码,但首先,我们将函数声明置于顶部,这样执行的顺序就更清楚了

def keeps(x):
    y = x[:]  #Here you are creating a modifiable copy of the original x list and referencing it with y
    y[1] = 2
    return y

def changes(x):
    y = x  # Here you are just referencing x itself with a new name y
    y[1] = 2
    return y

a = [1,1,1]

aout = keeps(a)
print(a, aout)

aout = changes(a)
print(a, aout)

基本上,如果您只是将另一个变量名分配给一个列表,那么您将为同一个对象指定两个名称,因此内容中的任何更改都可能影响两个“列表”。当您使用
y=x[:]
时,实际上是在内存中通过列表切片创建
x
列表的新副本,并将新变量名
y
分配给该列表的新副本。

可能是重复的,绝对有用:欢迎使用Python。正如您已经注意到的,并非所有语言都以相同的方式工作,因此,尽管它们通常有共同的概念(变量、函数、迭代、条件等),但您会发现这些概念的实现在不同的语言之间可能有很大的差异,因此不要假设表面上的相似性意味着相似的行为-注意,花点时间学习新语言,不要先入为主,这样你将节省大量的时间、痛苦和挫折。可能重复的可能重复的可能重复的可能重复的,绝对有用:欢迎使用Python。正如您已经注意到的,并非所有语言都以相同的方式工作,因此,尽管它们通常有共同的概念(变量、函数、迭代、条件等),但您会发现这些概念的实现在不同的语言之间可能有很大的差异,因此不要假设表面上的相似性意味着相似的行为-注意,花点时间学习新的语言,不要先入为主,这样你会节省很多时间、痛苦和挫折